日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Redis分布式鎖解決多進(jìn)程/多線程下單個進(jìn)程/單個線程運行

Redis分布式鎖解決多進(jìn)程/多線程下單個進(jìn)程/單個線程運行

作者:lightcity 2021-09-10 21:25:43

存儲

存儲軟件

分布式

Redis 最近,有兩臺容器,當(dāng)程序運行時,會發(fā)送多份通知,那么需要保證同一時刻只有一個進(jìn)程(一臺容器)來運行,此時用分布式鎖解決該問題。

公司主營業(yè)務(wù):網(wǎng)站制作、成都網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出揭陽免費做網(wǎng)站回饋大家。

[[423225]]

1.導(dǎo)語

在業(yè)務(wù)開發(fā)中像訂單寫入,一般需要單線程來保證訂單寫入數(shù)據(jù)庫,防止數(shù)據(jù)多次被插入。

最近,有兩臺容器,當(dāng)程序運行時,會發(fā)送多份通知,那么需要保證同一時刻只有一個進(jìn)程(一臺容器)來運行,此時用分布式鎖解決該問題。

業(yè)界也有許多解決這種方案,這里以redis分布式鎖來解決。

簡單來說就是采用golang redis庫實現(xiàn)下面方案即可。

2.redis的分布式鎖實現(xiàn)

2.1 setnx+expire

setnx key value,將key設(shè)置為value,當(dāng)鍵不存在時,才能成功,若鍵存在,什么也不做,成功返回1,失敗返回0。

SETNX實際上就是SET IF NOT Exists的縮寫。

  
 
 
  1. setnx key val 
  2. expire key seconds 

但是,上述兩個操作不具有原子性,如果執(zhí)行完第一條指令應(yīng)用異?;蛘咧貑⒘?,鎖將無法過期。

2.2 lua腳本

既然是原子性無法保證,那就采用執(zhí)行l(wèi)ua腳本的原子性,將上述兩個操作封裝到lua腳本中便可以實現(xiàn)。

  
 
 
  1. if redis.call('setnx',KEYS[1],ARGV[1]) == 1 then 
  2.    redis.call('expire',KEYS[1],ARGV[2]) 
  3. else 
  4.    return 0 
  5. end; 

2.3 攜帶TTL的set

從 Redis 2.6.12 版本開始, SET 命令的行為可以通過一系列參數(shù)來修改。

  
 
 
  1. SET key value [EX seconds]  
  2. [PX milliseconds] [NX|XX] 

將字符串值 value 關(guān)聯(lián)到 key 。

如果 key 已經(jīng)持有其他值, SET 就覆寫舊值,無視類型。

對于某個原本帶有生存時間(TTL)的鍵來說, 當(dāng) SET 命令成功在這個鍵上執(zhí)行時, 這個鍵原有的 TTL 將被清除。

  • EX second :設(shè)置鍵的過期時間為 second 秒。SET key value EX second 效果等同于 SETEX key second value 。
  • PX millisecond :設(shè)置鍵的過期時間為 millisecond 毫秒。SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。
  • NX :只在鍵不存在時,才對鍵進(jìn)行設(shè)置操作。SET key value NX 效果等同于 SETNX key value 。
  • XX :只在鍵已經(jīng)存在時,才對鍵進(jìn)行設(shè)置操作。

直接使用可能存在如下問題:

  • 超時解鎖導(dǎo)致并發(fā)

例如:如果線程 A 成功獲取鎖并設(shè)置過期時間 30 秒,但線程 A 執(zhí)行時間超過了 30 秒,鎖過期自動釋放,此時線程 B 獲取到了鎖,線程 A 和線程 B 并發(fā)執(zhí)行。

A、B 兩個線程發(fā)生并發(fā)顯然是不被允許的,一般有兩種方式解決該問題:

解決方案:1)確保代碼在過期時間之前釋放。2)為獲取鎖的線程增加守護(hù)線程,為將要過期但未釋放的鎖增加有效時間。

鎖被別的線程誤刪除。

例如:如果線程 A 成功獲取到了鎖,并且設(shè)置了過期時間 30 秒,但線程 A 執(zhí)行時間超過了 30 秒,鎖過期自動釋放,此時線程 B 獲取到了鎖;隨后 A 執(zhí)行完成,線程 A 使用 DEL 命令來釋放鎖,但此時線程 B 加的鎖還沒有執(zhí)行完成,線程 A 實際釋放的線程 B 加的鎖。

解決方案是:通過在 value 中設(shè)置當(dāng)前線程加鎖的標(biāo)識,在刪除之前驗證 key 對應(yīng)的 value 判斷鎖是否是當(dāng)前線程持有??缮梢粋€ UUID 標(biāo)識當(dāng)前線程,使用 lua 腳本做驗證標(biāo)識和解鎖操作。

學(xué)習(xí)文章:

https://xiaomi-info.github.io/2019/12/17/redis-distributed-lock/

https://zhuanlan.zhihu.com/p/115848078


標(biāo)題名稱:Redis分布式鎖解決多進(jìn)程/多線程下單個進(jìn)程/單個線程運行
轉(zhuǎn)載注明:http://www.5511xx.com/article/dpgeesd.html