精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis 分布式鎖進化史解讀+缺陷分析

存儲 存儲軟件 分布式 Redis
近兩年來微服務變得越來越熱門,越來越多的應用部署在分布式環境中,在分布式環境中,數據一致性是一直以來需要關注并且去解決的問題,分布式鎖也就成為了一種廣泛使用的技術,常用的分布式實現方式為Redis,Zookeeper,其中基于Redis的分布式鎖的使用更加廣泛。

 Redis分布式鎖進化史

近兩年來微服務變得越來越熱門,越來越多的應用部署在分布式環境中,在分布式環境中,數據一致性是一直以來需要關注并且去解決的問題,分布式鎖也就成為了一種廣泛使用的技術,常用的分布式實現方式為Redis,Zookeeper,其中基于Redis的分布式鎖的使用更加廣泛。

但是在工作和網絡上看到過各個版本的Redis分布式鎖實現,每種實現都有一些不嚴謹的地方,甚至有可能是錯誤的實現,包括在代碼中,如果不能正確的使用分布式鎖,可能造成嚴重的生產環境故障,本文主要對目前遇到的各種分布式鎖以及其缺陷做了一個整理,并對如何選擇合適的Redis分布式鎖給出建議。

[[255985]]

各個版本的Redis分布式鎖

V1.0

  1. tryLock(){   
  2.    SETNX Key 1 
  3.    EXPIRE Key Seconds 
  4. release(){   
  5.  DELETE Key 

這個版本應該是最簡單的版本,也是出現頻率很高的一個版本,首先給鎖加一個過期時間操作是為了避免應用在服務重啟或者異常導致鎖無法釋放后,不會出現鎖一直無法被釋放的情況。

這個方案的一個問題在于每次提交一個Redis請求,如果執行完***條命令后應用異常或者重啟,鎖將無法過期,一種改善方案就是使用Lua腳本(包含SETNX和EXPIRE兩條命令),但是如果Redis僅執行了一條命令后crash或者發生主從切換,依然會出現鎖沒有過期時間,最終導致無法釋放。

另外一個問題在于,很多同學在釋放分布式鎖的過程中,無論鎖是否獲取成功,都在finally中釋放鎖,這樣是一個鎖的錯誤使用,這個問題將在后續的V3.0版本中解決。

針對鎖無法釋放問題的一個解決方案基于GETSET命令來實現

V1.1 基于GETSET

  1. tryLock(){   
  2.    NewExpireTime=CurrentTimestamp+ExpireSeconds 
  3.    if(SETNX Key NewExpireTime Seconds){ 
  4.         oldExpireTime = GET(Key
  5.          if( oldExpireTime < CurrentTimestamp){ 
  6.               NewExpireTime=CurrentTimestamp+ExpireSeconds 
  7.              CurrentExpireTime=GETSET(Key,NewExpireTime) 
  8.              if(CurrentExpireTime == oldExpireTime){ 
  9.                return 1; 
  10.              }else
  11.                return 0; 
  12.              } 
  13.         } 
  14.    } 
  15. release(){   
  16.        DELETE key 
  17.    } 

思路:

  1. SETNX(Key,ExpireTime)獲取鎖
  2. 如果獲取鎖失敗,通過GET(Key)返回的時間戳檢查鎖是否已經過期
  3. GETSET(Key,ExpireTime)修改Value為NewExpireTime
  4. 檢查GETSET返回的舊值,如果等于GET返回的值,則認為獲取鎖成功

注意:這個版本去掉了EXPIRE命令,改為通過Value時間戳值來判斷過期

問題:

  1. 在鎖競爭較高的情況下,會出現Value不斷被覆蓋,但是沒有一個Client獲取到鎖
  2. 在獲取鎖的過程中不斷的修改原有鎖的數據,設想一種場景C1,C2競爭鎖,C1獲取到了鎖,C2鎖執行了GETSET操作修改了C1鎖的過期時間,如果C1沒有正確釋放鎖,鎖的過期時間被延長,其它Client需要等待更久的時間

V2.0 基于SETNX

  1. tryLock(){    
  2.    SETNX Key 1 Seconds  
  3.  
  4. release(){    
  5.  DELETE Key  

Redis 2.6.12版本后SETNX增加過期時間參數,這樣就解決了兩條命令無法保證原子性的問題。但是設想下面一個場景:

  1. C1成功獲取到了鎖,之后C1因為GC進入等待或者未知原因導致任務執行過長,***在鎖失效前C1沒有主動釋放鎖
  2. C2在C1的鎖超時后獲取到鎖,并且開始執行,這個時候C1和C2都同時在執行,會因重復執行造成數據不一致等未知情況
  3. C1如果先執行完畢,則會釋放C2的鎖,此時可能導致另外一個C3進程獲取到了鎖

大致的流程圖

 

存在問題:

  1. 由于C1的停頓導致C1 和C2同都獲得了鎖并且同時在執行,在業務實現間接要求必須保證冪等性
  2. C1釋放了不屬于C1的鎖

V3.0

  1. tryLock(){    
  2.    SETNX Key UnixTimestamp Seconds  
  3.  
  4. release(){    
  5.    EVAL( 
  6.      //LuaScript 
  7.      if redis.call("get",KEYS[1]) == ARGV[1] then 
  8.          return redis.call("del",KEYS[1]) 
  9.      else 
  10.          return 0 
  11.      end 
  12.    ) 

這個方案通過指定Value為時間戳,并在釋放鎖的時候檢查鎖的Value是否為獲取鎖的Value,避免了V2.0版本中提到的C1釋放了C2持有的鎖的問題;另外在釋放鎖的時候因為涉及到多個Redis操作,并且考慮到Check And Set 模型的并發問題,所以使用Lua腳本來避免并發問題。

存在問題:

  • 如果在并發極高的場景下,比如搶紅包場景,可能存在UnixTimestamp重復問題,另外由于不能保證分布式環境下的物理時鐘一致性,也可能存在UnixTimestamp重復問題,只不過極少情況下會遇到。

V3.1

  1. tryLock(){    
  2.    SET Key UniqId Seconds  
  3.  
  4. release(){    
  5.    EVAL(  
  6.      //LuaScript 
  7.      if redis.call("get",KEYS[1]) == ARGV[1] then 
  8.          return redis.call("del",KEYS[1]) 
  9.      else 
  10.          return 0 
  11.      end 
  12.    )  

Redis 2.6.12后SET同樣提供了一個NX參數,等同于SETNX命令,官方文檔上提醒后面的版本有可能去掉SETNX, SETEX, PSETEX,并用SET命令代替,另外一個優化是使用一個自增的唯一UniqId代替時間戳來規避V3.0提到的時鐘問題。

這個方案是目前***的分布式鎖方案,但是如果在Redis集群環境下依然存在問題:

由于Redis集群數據同步為異步,假設在Master節點獲取到鎖后未完成數據同步情況下Master節點crash,此時在新的Master節點依然可以獲取鎖,所以多個Client同時獲取到了鎖

分布式Redis鎖:Redlock

V3.1的版本僅在單實例的場景下是安全的,針對如何實現分布式Redis的鎖,國外的分布式專家有過激烈的討論, antirez提出了分布式鎖算法Redlock,在distlock話題下可以看到對Redlock的詳細說明,下面是Redlock算法的一個中文說明(引用)

假設有N個獨立的Redis節點

  • 獲取當前時間(毫秒數)。
  • 按順序依次向N個Redis節點執行獲取鎖的操作。這個獲取操作跟前面基于單Redis節點的獲取鎖的過程相同,包含隨機字符串myrandomvalue,也包含過期時間(比如PX 30000,即鎖的有效時間)。為了保證在某個Redis節點不可用的時候算法能夠繼續運行,這個獲取鎖的操作還有一個超時時間(time out),它要遠小于鎖的有效時間(幾十毫秒量級)。客戶端在向某個Redis節點獲取鎖失敗以后,應該立即嘗試下一個Redis節點。這里的失敗,應該包含任何類型的失敗,比如該Redis節點不可用,或者該Redis節點上的鎖已經被其它客戶端持有(注:Redlock原文中這里只提到了Redis節點不可用的情況,但也應該包含其它的失敗情況)。
  • 計算整個獲取鎖的過程總共消耗了多長時間,計算方法是用當前時間減去第1步記錄的時間。如果客戶端從大多數Redis節點(>= N/2+1)成功獲取到了鎖,并且獲取鎖總共消耗的時間沒有超過鎖的有效時間(lock validity time),那么這時客戶端才認為最終獲取鎖成功;否則,認為最終獲取鎖失敗。
  • 如果最終獲取鎖成功了,那么這個鎖的有效時間應該重新計算,它等于最初的鎖的有效時間減去第3步計算出來的獲取鎖消耗的時間。
  • 如果最終獲取鎖失敗了(可能由于獲取到鎖的Redis節點個數少于N/2+1,或者整個獲取鎖的過程消耗的時間超過了鎖的最初有效時間),那么客戶端應該立即向所有Redis節點發起釋放鎖的操作(即前面介紹的Redis Lua腳本)。
  • 釋放鎖:對所有的Redis節點發起釋放鎖操作

然而Martin Kleppmann針對這個算法提出了質疑,提出應該基于fencing token機制(每次對資源進行操作都需要進行token驗證)

  1. Redlock在系統模型上尤其是在分布式時鐘一致性問題上提出了假設,實際場景下存在時鐘不一致和時鐘跳躍問題,而Redlock恰恰是基于timing的分布式鎖
  2. 另外Redlock由于是基于自動過期機制,依然沒有解決長時間的gc pause等問題帶來的鎖自動失效,從而帶來的安全性問題。 接著antirez又回復了Martin Kleppmann的質疑,給出了過期機制的合理性,以及實際場景中如果出現停頓問題導致多個Client同時訪問資源的情況下如何處理。

針對Redlock的問題,基于Redis的分布式鎖到底安全嗎給出了詳細的中文說明,并對Redlock算法存在的問題提出了分析。

總結

不論是基于SETNX版本的Redis單實例分布式鎖,還是Redlock分布式鎖,都是為了保證下特性

安全性:在同一時間不允許多個Client同時持有鎖

活性 死鎖:鎖最終應該能夠被釋放,即使Client端crash或者出現網絡分區(通常基于超時機制) 容錯性:只要超過半數Redis節點可用,鎖都能被正確獲取和釋放 所以在開發或者使用分布式鎖的過程中要保證安全性和活性,避免出現不可預測的結果。

另外每個版本的分布式鎖都存在一些問題,在鎖的使用上要針對鎖的實用場景選擇合適的鎖,通常情況下鎖的使用場景包括:

Efficiency(效率):只需要一個Client來完成操作,不需要重復執行,這是一個對寬松的分布式鎖,只需要保證鎖的活性即可;

Correctness(正確性):多個Client保證嚴格的互斥性,不允許出現同時持有鎖或者對同時操作同一資源,這種場景下需要在鎖的選擇和使用上更加嚴格,同時在業務代碼上盡量做到冪等

在Redis分布式鎖的實現上還有很多問題等待解決,我們需要認識到這些問題并清楚如何正確實現一個Redis 分布式鎖,然后在工作中合理的選擇和正確的使用分布式鎖。

責任編輯:武曉燕 來源: dianwoda
相關推薦

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2019-06-19 15:54:12

Redis緩存內存

2014-09-01 16:29:34

2022-03-04 09:54:04

Redis分布式鎖腳本

2011-12-21 16:44:00

信息圖手機進化史

2019-06-19 15:40:06

分布式鎖RedisJava

2011-11-29 09:54:20

Google進化史

2010-07-27 14:04:52

2011-11-03 15:25:07

Android

2011-09-01 09:34:21

架構

2022-06-30 08:04:16

Redis分布式鎖Redisson

2018-03-23 12:20:25

數據中心網絡數據

2010-01-21 16:08:26

C++語言

2024-09-21 10:43:15

數據技術信息

2010-10-09 14:46:20

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數據分布式鎖

2010-04-07 14:54:20

Unix操作系統

2022-03-25 14:01:20

元宇宙虛擬世界進化

2019-08-29 08:13:28

點贊
收藏

51CTO技術棧公眾號

欧美老肥妇做.爰bbww| 国产欧美一区二区三区在线老狼| 九九九久久久久久| 日韩人妻一区二区三区| 福利一区视频| 亚洲高清免费观看| 亚欧洲精品在线视频免费观看| 国产aⅴ爽av久久久久成人| 亚洲一区二区免费看| 久久精品视频在线| 亚洲永久无码7777kkk| 日韩深夜福利网站| 欧美日韩一区二区免费在线观看| 国产成人三级视频| 户外极限露出调教在线视频| 国产精品亚洲一区二区三区妖精 | 九九热线视频只有这里最精品| 亚洲日本va午夜在线影院| 久久亚洲高清| www.蜜臀av| 男女视频一区二区| 91国偷自产一区二区三区的观看方式| 免费看一级大片| 欧美日本成人| 亚洲国产91色在线| 欧美熟妇另类久久久久久多毛| 桃子视频成人app| 婷婷综合另类小说色区| 免费看黄色a级片| 91青青在线视频| 91免费版在线看| 国产精品亚洲不卡a| 国产精品一区二区三区在线免费观看| 噜噜噜久久亚洲精品国产品小说| 欧美极品欧美精品欧美视频| 国产午夜手机精彩视频| 欧美hd在线| 尤物九九久久国产精品的分类 | 国产日韩欧美制服另类| 精品不卡一区二区三区| 懂色av成人一区二区三区| 国产一区二区三区免费观看| 国产精品成人在线| 国产午夜无码视频在线观看| 欧美一级久久| 青草成人免费视频| 无码人妻av一区二区三区波多野| 99热在线精品观看| 98视频在线噜噜噜国产| 日韩成人一区二区三区| 国产精品国码视频| 欧美国产日韩一区| 九九九在线视频| 欧美日韩午夜| 久久久久国产精品www| 久久亚洲国产成人精品性色| 伊人久久综合| 91国内在线视频| 神马久久久久久久| 日韩中文字幕麻豆| 国产欧美精品一区二区| 91精东传媒理伦片在线观看| 久久99深爱久久99精品| 亚洲一区亚洲二区亚洲三区| 国产黄频在线观看| 成人激情视频网站| 久久国产欧美精品| sese一区| 亚洲欧洲制服丝袜| 亚洲精品蜜桃久久久久久| free性m.freesex欧美| 精品久久久久久久大神国产| av丝袜天堂网| 成人黄色91| 亚洲成人激情视频| 国精产品一区二区三区| 99热国内精品| 欧美激情一二三| 无码人妻精品一区二区50| 免费在线观看日韩欧美| 97免费资源站| 黄色在线免费观看大全| 中文字幕一区av| 天堂8在线天堂资源bt| 性欧美18~19sex高清播放| 91电影在线观看| 亚洲精品在线网址| 欧美一区 二区| 色噜噜亚洲精品中文字幕| 制服丨自拍丨欧美丨动漫丨| 亚洲韩日在线| 国产欧美日韩专区发布| 欧美一级淫片aaaaaa| 国产性色一区二区| 8x8x华人在线| 亚洲第一二三四区| 精品日韩一区二区三区免费视频| 波多野结衣 在线| 国产在线欧美| 国产精品三级久久久久久电影| 成人1区2区3区| 国产视频不卡一区| 久久久久久免费看| 999精品视频在线观看| 国产午夜精品理论片a级探花| 五月综合色婷婷| 爽好多水快深点欧美视频| 亚洲综合小说区| 在线看av的网址| 狠狠躁夜夜躁人人躁婷婷91 | 久久久精品国产**网站| 精品国产一区二区三区久久久| 日韩精品在线免费看| 久久精品国产99| 久久资源av| 毛片在线网址| 欧美一区二区在线播放| 91久久免费视频| 狠狠色综合网| 96国产粉嫩美女| 国产福利片在线| 欧美日韩精品二区| www.四虎精品| 亚洲澳门在线| 国产伦精品免费视频| 免费在线视频一级不卡| 亚洲成人7777| 91精品人妻一区二区三区蜜桃2| 波多野结衣在线播放一区| 欧美洲成人男女午夜视频| 欧美 日韩 国产 精品| 亚洲精品日韩综合观看成人91| 午夜视频你懂的| 国产欧美高清视频在线| 奇门遁甲1982国语版免费观看高清| 丰满熟妇乱又伦| 一区二区三区产品免费精品久久75| 一道本在线免费视频| 日韩成人激情| 国产精品狠色婷| 第一福利在线| 色诱视频网站一区| 免费黄色在线视频| 久久综合影视| 欧美二区在线| 电影天堂国产精品| 亚洲人成电影在线| 亚洲av无码乱码国产精品fc2| 国产日韩欧美综合在线| 天堂中文视频在线| 久久精品99久久无色码中文字幕| 国产精品日韩一区| 一区二区高清不卡| 欧美裸体bbwbbwbbw| 国产日产精品一区二区三区的介绍| 久久精品二区亚洲w码| 伊人久久大香线蕉精品 | 精品国产aⅴ麻豆| 男人久久天堂| 亚洲片国产一区一级在线观看| 亚洲欧美日韩一区二区三区四区| 欧美国产1区2区| 一起操在线视频| 欧美a级片网站| 精品蜜桃传媒| 视频精品导航| 欧美精品一区二区三区国产精品| 亚洲毛片在线播放| 精品福利在线看| 三区四区在线观看| 国产黄色精品视频| 成年人网站免费视频| 一区二区美女| 91天堂在线视频| a级片在线免费| 亚洲视频在线播放| 国产视频aaa| 精品免费在线视频| 91社区视频在线观看| 国产老女人精品毛片久久| 777777av| 欧美黄色大片在线观看| 国产精品国产三级国产专区53| 成人性生活av| 久久久av一区| 亚洲欧美综合在线观看| 欧美日韩一区二区三区视频| 久久午夜无码鲁丝片| 国产欧美一区二区在线| 最新中文字幕日本| 日本午夜一本久久久综合| 男女爱爱视频网站| 国产日产一区 | 亚洲激情中文1区| 亚洲黄色在线网站| 国产精品一区二区在线观看网站| 女人另类性混交zo| 国产综合视频| 亚洲欧洲久久| 日韩三级av| 99爱精品视频| 岛国一区二区| 欧美中文字幕在线播放| 亚洲综合图区| 中文字幕欧美日韩精品| 亚欧在线观看视频| 欧美成人一区二区三区在线观看| 亚洲 国产 日韩 欧美| 亚洲成av人在线观看| 老司机成人免费视频| 久久精品水蜜桃av综合天堂| 日本人dh亚洲人ⅹxx| 美女视频网站久久| 国产精品亚洲a| 一道本一区二区| 久久99久久久久久| 羞羞答答成人影院www| 天堂√在线观看一区二区| 久久精品色播| 国产精品免费一区二区| 国产精品中文| 成人疯狂猛交xxx| 97精品国产99久久久久久免费| 97在线免费视频| 国产第一页在线视频| 久久精品精品电影网| 爱久久·www| 亚洲色图狂野欧美| 你懂的在线播放| 日韩国产在线播放| 亚州av在线播放| 亚洲第一网中文字幕| 亚洲第一天堂在线观看| 日韩视频123| jizz国产视频| 91精品国产免费| 亚洲综合精品国产一区二区三区 | 亚洲精选一区二区三区| 在线播放欧美女士性生活| 在线观看国产成人| 欧美日韩在线播放一区| 中文字幕人妻一区二区在线视频 | 日韩在线不卡| 一区二区三区四区国产| 色小子综合网| 熟妇熟女乱妇乱女网站| 欧美a级在线| 97av中文字幕| 亚洲精品三级| 成人一级片网站| 视频在线在亚洲| 亚洲色图38p| 精品亚洲免费视频| 五月天婷婷在线观看视频| 国产主播一区二区| 亚洲精品国产久| 国产成人啪午夜精品网站男同| youjizz.com国产| 9l国产精品久久久久麻豆| 精品无码人妻一区| 国产精品热久久久久夜色精品三区| 日本高清黄色片| 亚洲三级电影网站| 久久免费视频6| 欧美午夜片在线免费观看| 老熟妇一区二区三区| 欧美日韩国产电影| av中文字幕播放| 亚洲国产精品悠悠久久琪琪| 男人天堂综合| 日韩一区视频在线| 波多野结衣在线播放| 91成人在线观看国产| 久久久久久久性潮| 国产伦精品一区二区三毛| 校园春色另类视频| 正在播放精油久久| 中文亚洲字幕| 欧美成人福利在线观看| 大尺度一区二区| 亚洲国产天堂av| 亚洲女子a中天字幕| 男女视频免费看| 欧美精品1区2区3区| 少妇一级淫片免费看| 在线观看久久久久久| gogo高清在线播放免费| 国产成人综合亚洲| 国产成人福利av| 亚洲狠狠婷婷综合久久久| 国模 一区 二区 三区| 玩弄japan白嫩少妇hd| 国产精一区二区三区| 熟女俱乐部一区二区| 亚洲综合另类小说| 在线观看日韩一区二区| 日韩电影中文字幕| 成人影院在线看| 国产精品免费一区二区三区都可以| 亚洲精品一区二区三区在线| 日韩在线三级| 一区二区三区福利| 美女日批在线观看| 国产精品久久久久久久午夜片 | 午夜在线一区| 亚洲熟女乱综合一区二区| 欧美激情一区三区| 国产成人精品一区二三区| 日韩欧美一区电影| 日本中文字幕在线看| 日本午夜精品理论片a级appf发布| 136国产福利精品导航网址应用| 亚洲一区精彩视频| 久久夜色精品| v天堂中文在线| 亚洲午夜在线电影| 99产精品成人啪免费网站| 亚洲三级黄色在线观看| 午夜久久中文| 精品国产免费久久久久久尖叫 | 日韩在线看片| 无码少妇一区二区三区芒果| 99国内精品久久| 精品无码人妻一区二区三| 91精品在线一区二区| 日本韩国在线视频爽| 国产精品黄视频| 国产精品一在线观看| www.亚洲天堂网| 91蝌蚪porny成人天涯| 精品无码人妻一区二区三区| 日韩精品最新网址| 少女频道在线观看高清| 亚洲自拍高清视频网站| 亚州av乱码久久精品蜜桃| 久久国产精品国产精品| 国产精品素人视频| 亚洲无码久久久久久久| 日韩一区二区久久久| 少妇高潮一区二区三区99| 水蜜桃一区二区三区| 日本麻豆一区二区三区视频| 国产精品www爽爽爽| 欧美午夜寂寞影院| 国产这里有精品| 日韩电影在线看| 日本精品免费| 青草国产精品久久久久久| 中文字幕免费在线看线人动作大片| 色狠狠桃花综合| 五月婷婷在线观看| 亚洲a一级视频| 国产精品红桃| www.免费av| 在线亚洲人成电影网站色www| 国产色在线 com| 国产区亚洲区欧美区| 亚洲美女视频| caopor在线| 欧美午夜片欧美片在线观看| 国产在线超碰| 91精品国产综合久久香蕉| 国产精品啊啊啊| 一本色道久久综合亚洲精品图片| 欧美在线三级电影| 麻豆网站在线看| 成人黄动漫网站免费| 亚洲国产专区校园欧美| 91成人破解版| 欧美精品高清视频| 黄色的视频在线观看| 蜜桃麻豆www久久国产精品| 美女任你摸久久| 少妇aaaaa| 精品国产网站在线观看| sis001欧美| 日韩人妻精品一区二区三区| 成人污污视频在线观看| 亚洲精品一区二三区| 欧美国产日韩免费| 国产亚洲第一伦理第一区| 亚洲黄色片免费看| 午夜国产不卡在线观看视频| 高清毛片在线看| 国产精品三区四区| 青青草97国产精品免费观看 | 欧美日韩在线第一页| 日本综合在线| 久久久人人爽| 国产一区二区免费视频| 51国产偷自视频区视频| 欧美成人精品激情在线观看| 色婷婷av一区二区三区丝袜美腿| 中文字幕亚洲影院| 欧美性高潮床叫视频| 超鹏97在线| 亚洲二区三区四区| 26uuu色噜噜精品一区| 99国产在线播放| 国产精品成人观看视频国产奇米|