最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年07月27日 09:58:32   作者:保軍Baojun  
這篇文章主要介紹了使用redis分布式鎖解決并發(fā)線程資源共享問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

前言

眾所周知, 在多線程中,因為共享全局變量,會導(dǎo)致資源修改結(jié)果不一致,所以需要加鎖來解決這個問題,保證同一時間只有一個線程對資源進行操作

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

原理

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

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

圖示:

分析

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

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

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

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

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

為什么用redis?

因為redis是單線程的,不存在多線程資源競爭,并且它真的很快

為什么用setnx 而不是set?

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

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

偽代碼:

# 設(shè)置redis鎖的
  redis key = 'residue_ticket_lock'

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis中的bitmap詳解

    Redis中的bitmap詳解

    BitMap是通過一個bit位來表示某個元素對應(yīng)的值或者狀態(tài),其中的key就是對應(yīng)元素本身。我們知道8個bit可以組成一個Byte,所以bitmap本身會極大的節(jié)省儲存空間,下面通過本文給大家介紹Redis中的bitmap知識,感興趣的朋友一起看看吧
    2021-10-10
  • Redis遠程字典服務(wù)器?hash類型示例詳解

    Redis遠程字典服務(wù)器?hash類型示例詳解

    這篇文章主要介紹了Redis遠程字典服務(wù)器?hash類型示例詳解,本文通過示例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 使用redis分布式鎖解決并發(fā)線程資源共享問題

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

    這篇文章主要介紹了使用redis分布式鎖解決并發(fā)線程資源共享問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • 幾分鐘教你掌握Redis簡單動態(tài)字符串SDS

    幾分鐘教你掌握Redis簡單動態(tài)字符串SDS

    這篇文章主要為大家介紹了幾分鐘教你掌握Redis簡單動態(tài)字符串SDS方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Redis?集群模式(Cluster)原理詳解

    Redis?集群模式(Cluster)原理詳解

    redis?cluster集群是一個由多個主從節(jié)點集群組成的分布式服務(wù)集群,它具有復(fù)制、高可用和分片特性,cluster集群不需要sentinel?哨兵也能完成節(jié)點移除和故障轉(zhuǎn)移的功能,本文就詳細的給大家介紹一下Redis?集群模式原理,感興趣的朋友跟著小編一起來看看吧
    2023-07-07
  • Redis集群利用Redisson實現(xiàn)分布式鎖方式

    Redis集群利用Redisson實現(xiàn)分布式鎖方式

    這篇文章主要介紹了Redis集群利用Redisson實現(xiàn)分布式鎖方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Redis如何高效刪除大key

    Redis如何高效刪除大key

    這篇文章主要介紹了Redis如何高效刪除大key問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • redis的2種持久化方案深入講解

    redis的2種持久化方案深入講解

    這篇文章主要給大家介紹了關(guān)于redis的2種持久化方案的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用redis具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • Redis分片集群的實現(xiàn)示例

    Redis分片集群的實現(xiàn)示例

    本文介紹了搭建Redis分片集群,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • redis分布式鎖之可重入鎖的實現(xiàn)代碼

    redis分布式鎖之可重入鎖的實現(xiàn)代碼

    相信大家都知道可重入鎖的作用防止在同一線程中多次獲取鎖而導(dǎo)致死鎖發(fā)生,本文通過幾個例子給大家分享redis分布式鎖之可重入鎖的實現(xiàn)代碼,對redis分布式鎖的相關(guān)知識,感興趣的朋友一起看看吧
    2021-05-05

最新評論

那曲县| 云霄县| 桃园市| 黑龙江省| 都昌县| 颍上县| 曲沃县| 临沧市| 镇巴县| 衢州市| 溧阳市| 潜山县| 安远县| 昆山市| 苏尼特右旗| 兰考县| 寿光市| 增城市| 台前县| 宝兴县| 洪雅县| 南漳县| 宣恩县| 福清市| 石泉县| 栾川县| 雅安市| 手机| 玉田县| 南昌市| 若尔盖县| 于都县| 刚察县| 依安县| 正蓝旗| 宁都县| 永春县| 襄城县| 富裕县| 涞源县| 安福县|