麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > Redis > 正文

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

2020-10-28 21:29:36
字體:
來源:轉載
供稿:網友

前言

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

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

原理

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

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

圖示:

分析

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

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

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

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

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

為什么用redis?

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

為什么用setnx 而不是set?

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

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

偽代碼:

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 99精品视频久久精品视频 | 国产手机在线视频 | 久久91亚洲精品久久91综合 | 日韩视频一区 | 亚洲精品一区二区三区大胸 | 中国性xxx | 黄网站在线免费看 | 国产精品成人久久久久a级 欧美特黄一级高清免费的香蕉 | 亚洲爱爱图 | 久久久久久三区 | 久草在线新时代视觉 | 国产乱淫av片免费观看 | 国产影视 | 4399一级成人毛片 | 亚洲va久久久噜噜噜久久男同 | 欧美日韩免费一区 | 国产亚洲精品综合一区91555 | av在线播放亚洲 | 91 免费视频 | 免费观看视频在线 | 91久久国产露脸精品国产 | 精品一区二区三区毛片 | 国产精品9191 | 黄色片免费看网站 | av在线免费观看国产 | 久久精品视频日本 | 一级做a爱片久久毛片a高清 | 免费看性xxx高清视频自由 | 污片视频网站 | 久久久噜噜噜久久熟有声小说 | 黄色成人小视频 | 亚洲精品久久久久久下一站 | 午夜91视频| 男女羞羞在线观看 | 国内毛片视频 | 久久精品亚洲欧美日韩精品中文字幕 | 热99在线视频 | 国产精品成人一区二区三区吃奶 | 一级性色 | 天天草夜夜爽 | 欧产日产国产精品乱噜噜 |