一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Redis - 使用redis分布式鎖解決并發(fā)線程資源共享問題

使用redis分布式鎖解決并發(fā)線程資源共享問題

2019-11-26 15:39保軍Baojun Redis

這篇文章主要介紹了使用redis分布式鎖解決并發(fā)線程資源共享問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

眾所周知, 在多線程中,因?yàn)楣蚕砣肿兞?會(huì)導(dǎo)致資源修改結(jié)果不一致,所以需要加鎖來解決這個(gè)問題,保證同一時(shí)間只有一個(gè)線程對資源進(jìn)行操作

但是在分布式架構(gòu)中,我們的服務(wù)可能會(huì)有n個(gè)實(shí)例,但線程鎖只對同一個(gè)實(shí)例有效,就需要用到分布式鎖----redis setnx

原理

修改某個(gè)資源時(shí), 在redis中設(shè)置一個(gè)key,value根據(jù)實(shí)際情況自行決定如何表示

我們既然要通過檢查key是否存在(存在表示有線程在修改資源,資源上鎖,其他線程不可同時(shí)操作,若key不存在,表示資源未被線程占用,允許線程搶占,然后將通過setnx設(shè)置vlaue,表示資源上鎖,其他線程不可同時(shí)操作)

圖示:

使用redis分布式鎖解決并發(fā)線程資源共享問題

分析

我們的服務(wù)處于一個(gè)集群中,如果只是簡單的的使用線程鎖來解決以上問題,是存在問題的:因?yàn)榫€程是基于進(jìn)程的,兩個(gè)web server處于不同的進(jìn)程空間

也就是說,user1的請求發(fā)往web server1,那只能與web server1的其他請求進(jìn)行鎖的操作,而不能對web server2的請求產(chǎn)生影響

上面的圖中,user1發(fā)往web server1的請求負(fù)責(zé)處理的線程為Thread1,同理負(fù)責(zé)處理user2發(fā)往web server2的請求的線程thread2

在同一時(shí)刻1,兩個(gè)線程都讀取了mysql中residue_ticket的值為100,對應(yīng)上圖 (1)(2), 各自對100進(jìn)行-1操作,更新到數(shù)據(jù)庫,對應(yīng)(3)(4)

我們預(yù)期的情況是residue_ticket值被減少了兩次,應(yīng)該為98,但是實(shí)際情況下,兩個(gè)線程都做了100-1=99的操作,并都將mysql中的值改為了99, 的這就會(huì)導(dǎo)致最終數(shù)據(jù)不一致,所以就要用到分布式鎖。

為什么用redis?

因?yàn)閞edis是單線程的,不存在多線程資源競爭,并且它真的很快

為什么用setnx 而不是set?

setnx表示只有在key不存在時(shí)才能設(shè)置成功,但是set會(huì)在key存在的情況下修改value

利用setnx的特性,我們可以這樣這樣設(shè)計(jì):

偽代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 設(shè)置redis鎖的
  redis key = 'residue_ticket_lock'
 
  # get_ticket是處理購票的邏輯
  def get_ticket():
    time_out = 5  # 為了防止線程過多,當(dāng)前線程獲取不到鎖,長時(shí)間處于循環(huán)中而導(dǎo)致的性能影響,我們設(shè)置一個(gè)超時(shí)時(shí)間,如果當(dāng)前線程在超時(shí)時(shí)間內(nèi)還沒有搶占到分布式鎖,就返回失敗的結(jié)果
    while True:
       if redis.setnx('residue_ticket_lock','lock',5):
          # 如果setnx返回True, 表示此刻沒有其他線程在操作數(shù)據(jù)庫,當(dāng)前線程可以上鎖成功,注意不僅設(shè)置了value=lock,還設(shè)置了過期時(shí)間,這是必要的,為了防止上鎖的線程異常崩掉導(dǎo)致不能釋放(刪除key)而導(dǎo)致其他所有線程永遠(yuǎn)拿不到操作權(quán)
          residue_ticket = mysql.get('residue_ticket')   # 從mysql中獲取當(dāng)前剩余票數(shù)
          mysql.update('residue_ticket',residue_ticket-1# 訂購成功,將票數(shù)-1,更新數(shù)據(jù)到mysql
          # 刪除key,釋放鎖
          redis.del('residue_ticket')
          return True
       else:
          # 如果setnx返回False,表示有其他線程對在操作,當(dāng)前線程等待0.01s,并繼續(xù)循環(huán)
          time.sleep(0.01)
          time_out -= 0.01
          continue
    return False

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.cnblogs.com/wangbaojun/p/11251403.html

延伸 · 閱讀

精彩推薦
  • Redis詳解Redis復(fù)制原理

    詳解Redis復(fù)制原理

    與大多數(shù)db一樣,Redis也提供了復(fù)制機(jī)制,以滿足故障恢復(fù)和負(fù)載均衡等需求。復(fù)制也是Redis高可用的基礎(chǔ),哨兵和集群都是建立在復(fù)制基礎(chǔ)上實(shí)現(xiàn)高可用的...

    李留廣10222021-08-09
  • RedisRedis全量復(fù)制與部分復(fù)制示例詳解

    Redis全量復(fù)制與部分復(fù)制示例詳解

    這篇文章主要給大家介紹了關(guān)于Redis全量復(fù)制與部分復(fù)制的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Redis爬蟲具有一定的參考學(xué)習(xí)...

    豆子先生5052019-11-27
  • Redisredis實(shí)現(xiàn)排行榜功能

    redis實(shí)現(xiàn)排行榜功能

    排行榜在很多地方都能使用到,redis的zset可以很方便地用來實(shí)現(xiàn)排行榜功能,本文就來簡單的介紹一下如何使用,具有一定的參考價(jià)值,感興趣的小伙伴們...

    乘月歸5022021-08-05
  • RedisRedis的配置、啟動(dòng)、操作和關(guān)閉方法

    Redis的配置、啟動(dòng)、操作和關(guān)閉方法

    今天小編就為大家分享一篇Redis的配置、啟動(dòng)、操作和關(guān)閉方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧 ...

    大道化簡5312019-11-14
  • RedisRedis 事務(wù)知識點(diǎn)相關(guān)總結(jié)

    Redis 事務(wù)知識點(diǎn)相關(guān)總結(jié)

    這篇文章主要介紹了Redis 事務(wù)相關(guān)總結(jié),幫助大家更好的理解和學(xué)習(xí)使用Redis,感興趣的朋友可以了解下...

    AsiaYe8232021-07-28
  • Redisredis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解

    redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格詳解

    這篇文章主要給大家介紹了關(guān)于redis中如何使用lua腳本讓你的靈活性提高5個(gè)逼格的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具...

    一線碼農(nóng)5812019-11-18
  • RedisRedis如何實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis如何實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離詳解

    Redis的主從架構(gòu),能幫助我們實(shí)現(xiàn)讀多,寫少的情況,下面這篇文章主要給大家介紹了關(guān)于Redis如何實(shí)現(xiàn)數(shù)據(jù)庫讀寫分離的相關(guān)資料,文中通過示例代碼介紹...

    羅兵漂流記6092019-11-11
  • Redisredis 交集、并集、差集的具體使用

    redis 交集、并集、差集的具體使用

    這篇文章主要介紹了redis 交集、并集、差集的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友...

    xiaojin21cen10152021-07-27
主站蜘蛛池模板: 草莓在深夜释放自己软件 | 九九热这里只有精品视频免费 | 日韩成人影视 | 日本动漫黄网站在线观看 | 欧美日韩一区二区中文字幕视频 | 亚洲国产天堂久久精品网 | 99re热这里只有精品 | 韩国久播影院理论片不卡影院 | 美女gif跪趴式抽搐动态图 | 果冻传媒新在线观看免费 | 99视频一区 | 我与么公激情性完整视频 | 亚洲精品国产一区二区在线 | 高清国产精品久久久久 | 二次元美女互摸隐私互扒 | 欧美激烈精交gif动态图18p | 羞羞答答免费人成黄页在线观看国产 | 国产高清久久 | 调教校花浣肠开菊 | 日韩欧美国产一区二区三区 | 午夜国产精品影院在线观看 | 亚洲精品福利在线 | 久久嫩草影院网站 | 俄罗斯一级大片 | 国产精品日韩欧美一区二区 | 亚洲码在线观看 | 国产普通话对白露脸流出 | 亚洲AV永久无码精品澳门 | 久久机热视频 这里只有精品首页 | 亚洲视频在线一区二区三区 | 99久久精品免费看国产四区 | 国产区综合另类亚洲欧美 | 明星ai智能人脸替换造梦在线播放 | 人与善xuanwen在线400 | 爽好紧别夹宝贝叫大声点护士 | 国产永久免费爽视频在线 | a片毛片在线免费看 | 成人精品区| 亚洲国产精品牛在线 | 日韩精品欧美高清区 | 欧美日韩视频在线一区二区 |