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

分布式鎖實現(xiàn)匯總-詳述基于Redis實現(xiàn)的那些細節(jié)

數(shù)據(jù)庫 Redis
目前Redis版本已經(jīng)發(fā)布到7.x,生產(chǎn)項目應該不會再使用2.x的版本,這里主要是為了更好的理解各種情況。

為了保證同一時間只有一個線程訪問某一代碼塊,Java中可以使用synchronized語法和ReentrantLock等本地鎖的方式。但是在分布式環(huán)境下,需要使用分布式鎖來保證不同節(jié)點的線程同步執(zhí)行。

常用的分布式鎖實現(xiàn)包括以下幾種:

  • 基于數(shù)據(jù)庫的分布式鎖:使用數(shù)據(jù)庫的事務和行級鎖來實現(xiàn)分布式鎖,通過在數(shù)據(jù)庫中創(chuàng)建一張鎖表來記錄鎖的狀態(tài)。
  • 基于Redis的分布式鎖:利用Redis的原子操作和過期時間特性,使用SETNX命令來獲取鎖,使用DEL命令來釋放鎖。
  • 基于Zookeeper的分布式鎖:利用Zookeeper的有序節(jié)點和watch機制,通過創(chuàng)建臨時有序節(jié)點來實現(xiàn)鎖的競爭和釋放。

三種分布式鎖對比


優(yōu)點

缺點

數(shù)據(jù)庫

簡單,使用方便,不需要引入Redis、zookeeper等中間件

不適合高并發(fā)的場景

db操作性能較差,有鎖表的風險

redis

性能好,適合高并發(fā)場景

較輕量級

較好的框架支持,如Redisson

過期時間不好控制。

需要考慮鎖被別的線程誤刪場景

zookeeper

有較好的性能和可靠性。

有封裝較好的框架,如Curator

性能不如redis實現(xiàn)的分布式鎖

比較重的分布式鎖

【基于Redis實現(xiàn)的分布式鎖】

早期版本實現(xiàn)

目前Redis版本已經(jīng)發(fā)布到7.x,生產(chǎn)項目應該不會再使用2.x的版本,這里主要是為了更好的理解各種情況。

在redis2.6.12之前,是通過setnx與expire兩個命令配合使用來實現(xiàn)的。setNX命令代表當key不存在時返回成功,否則返回失敗,即鎖已被其他線程占用。

setnx(key,value);
expire(key,seconds)

這種實現(xiàn)方式把加鎖和設置過期時間的步驟分成兩步,并不是原子操作,如果加鎖成功之后程序崩潰、服務宕機等異常情況,導致沒有設置過期時間,那么就會導致死鎖的問題,其他線程永遠都無法獲取這個鎖。

如何避免上述問題呢?早期redis版本,可以使用lua腳本,之后的版本,則也可以利用redis命令的擴展參數(shù)來實現(xiàn)。繼續(xù)...

Lua腳本

可以使用Lua腳本來保證原子性(包含setnx和expire兩條指令),lua腳本如下:

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

加鎖代碼如下:

// 使用lua腳本 保證原子性
public boolean tryLock_with_lua(String key, String UniqueId, int seconds) {
    String lua_scripts = "if redis.call('setnx',KEYS[1],ARGV[1]) == 1 then" +
            "redis.call('expire',KEYS[1],ARGV[2]) return 1 else return 0 end";
    List<String> keys = new ArrayList<>();
    List<String> values = new ArrayList<>();
    keys.add(key);
    values.add(UniqueId);
    values.add(String.valueOf(seconds));
    Object result = jedis.eval(lua_scripts, keys, values);
    return result.equals(1L);
}

SET的擴展命令(SET EX PX NX)

除了使用,使用Lua腳本,保證SETNX + EXPIRE兩條指令的原子性,我們還可以使用redis的SET指令擴展參數(shù),它也是原子性的!

SET key value[EX seconds][PX milliseconds][NX|XX]
  • EX seconds: 設定過期時間,單位為秒。
  • PX milliseconds: 設定過期時間,單位為毫秒。
  • NX: 表示key不存在的時候,才能set成功,也即保證只有第一個客戶端請求才能獲得鎖,而其他客戶端請求只能等其釋放鎖,才能獲取。
  • XX: 僅當key存在時設置值。

代碼如下:

public boolean tryLock_with_set(String key, String UniqueId, int seconds) {
    return "OK".equals(jedis.set(key, UniqueId, "NX", "EX", seconds));
}

value必須要具有唯一性,可以用UUID來做,設置隨機字符串保證唯一性。為什么要保證唯一呢?繼續(xù)...

釋放鎖

雖然我們在加鎖的時候,設置了默認過期時間,但我們肯定不能等著過期再釋放鎖。當前線程執(zhí)行完任務之后,需要手動刪除key,即釋放鎖。

// 錯誤的解鎖方法—直接刪除key
public void unlock_with_del(Jedis jedis,String key) {
  jedis.del(key);
}

通過del命令直接刪除,是否可行呢?結合下圖我們來分析一下:

線程A加鎖同時設置超時時間5秒,結果5s之后程序邏輯還沒有執(zhí)行完成,鎖已經(jīng)釋放。線程B此時也來嘗試加鎖并獲得了鎖,這時線程A業(yè)務執(zhí)行完成,釋放鎖,結果釋放了線程B持有的鎖。也就是說鎖被別的線程誤刪了。如何解決呢?這里就用到了前面提到的UUID,給value值設置一個標記當前線程唯一的隨機數(shù),在刪除的時候,校驗一下。同時,判斷是不是當前線程加的鎖和釋放鎖也要保證原子性。

// 使用Lua腳本進行解鎖操縱,解鎖的時候驗證value值
public boolean unlock(Jedis jedis,String key,String value) {
    String luaScript = "if redis.call('get',KEYS[1]) == ARGV[1] then " +
            "return redis.call('del',KEYS[1]) else return 0 end";
    return jedis.eval(luaScript, Collections.singletonList(key), Collections.singletonList(value)).equals(1L);
}

完成了鎖的獲取、鎖的釋放,這就OK了嘛?然而,并非如此。繼續(xù)...

Redission

(1)超時釋放

在分析鎖誤刪問題時提到,線程A設置了5秒超時,但5秒內(nèi),業(yè)務并未執(zhí)行完成,而鎖已超時釋放,從而導致了線程A和B同時持有了鎖。如何解決呢?把鎖過期時間設置長一些,算是一種解決方案,有沒有更好的呢?其實我們設想一下,是否可以給獲得鎖的線程,開啟一個定時守護線程,每隔一段時間檢查鎖是否還存在,存在則對鎖的過期時間延長,防止鎖過期提前釋放。這其實就是開源框架Redission采用的思路。

redission watchdog (源于網(wǎng)絡)

只要線程一加鎖成功,就會啟動一個watch dog看門狗,它是一個后臺線程,會每隔10秒檢查一下,如果線程1還持有鎖,那么就會不斷的延長鎖key的生存時間。因此,Redisson就是使用watch dog解決了鎖過期釋放,業(yè)務沒執(zhí)行完問題。

(2)可重入

另外還有一個問題,上述實現(xiàn)并非可重入鎖。所謂可重入鎖,即當線程在持有鎖的情況下再次請求加鎖,如果一個鎖支持一個線程多次加鎖,那么這個鎖就是可重入的。如果一個不可重入鎖被再次加鎖,由于該鎖已經(jīng)被持有,再次加鎖會失敗。Redis 可通過對鎖進行重入計數(shù),加鎖時加 1,解鎖時減 1,當計數(shù)歸 0 時釋放鎖。Redission中也有相關的實現(xiàn)。

如果key不存在,通過hash的方式保存,同時設置過期時間,反之如果存在就是+1。對應的就是'hincrby', KEYS[1], ARGV[2], 1這段命令,對hash結構的鎖重入次數(shù)+1。

Redlock+Redisson

如果線程一在Redis的master節(jié)點上拿到了鎖,但是加鎖的key還沒同步到slave節(jié)點。恰好這時,master節(jié)點發(fā)生故障,一個slave節(jié)點就會升級為master節(jié)點。線程二就可以獲取同個key的鎖啦,但線程一也已經(jīng)拿到鎖了,鎖的安全性就沒了。

為了解決這個問題,Redis作者 antirez提出一種高級的分布式鎖算法:Redlock(Redission中也有相關的實現(xiàn))。Redlock核心思想是這樣的:

搞多個Redis master部署,以保證它們不會同時宕掉。并且這些master節(jié)點是完全相互獨立的,相互之間不存在數(shù)據(jù)同步。同時,需要確保在這多個master實例上,是與在Redis單實例,使用相同方法來獲取和釋放鎖。

假設當前有5個Redis master節(jié)點,在5臺服務器上面運行這些Redis實例。

RedLock的實現(xiàn)步驟如下:

  • 獲取當前Unix時間,以毫秒為單位。
  • 依次嘗試從5個實例,使用相同的key和具有唯一性的value(例如UUID)獲取鎖。當向Redis請求獲取鎖時,客戶端應該設置一個網(wǎng)絡連接和響應超時時間,這個超時時間應該小于鎖的失效時間。例如你的鎖自動失效時間為10秒,則超時時間應該在5-50毫秒之間。這樣可以避免服務器端Redis已經(jīng)掛掉的情況下,客戶端還在死死地等待響應結果。如果服務器端沒有在規(guī)定時間內(nèi)響應,客戶端應該盡快嘗試去另外一個Redis實例請求獲取鎖。
  • 客戶端使用當前時間減去開始獲取鎖時間(步驟1記錄的時間)就得到獲取鎖使用的時間。當且僅當從大多數(shù)(N/2+1,這里是3個節(jié)點)的Redis節(jié)點都取到鎖,并且使用的時間小于鎖失效時間時,鎖才算獲取成功。
  • 如果取到了鎖,key的真正有效時間等于有效時間減去獲取鎖所使用的時間(步驟3計算的結果)。
  • 如果因為某些原因,獲取鎖失?。]有在至少N/2+1個Redis實例取到鎖或者取鎖時間已經(jīng)超過了有效時間),客戶端應該在所有的Redis實例上進行解鎖(即便某些Redis實例根本就沒有加鎖成功,防止某些節(jié)點獲取到鎖但是客戶端沒有得到響應而導致接下來的一段時間不能被重新獲取鎖
責任編輯:姜華 來源: 今日頭條
相關推薦

2017-04-13 10:51:09

Consul分布式

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數(shù)據(jù)分布式鎖

2022-10-27 10:44:14

分布式Zookeeper

2021-11-01 12:25:56

Redis分布式

2024-10-07 10:07:31

2024-04-01 05:10:00

Redis數(shù)據(jù)庫分布式鎖

2023-03-01 08:07:51

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2024-11-28 15:11:28

2023-10-11 09:37:54

Redis分布式系統(tǒng)

2020-07-30 09:35:09

Redis分布式鎖數(shù)據(jù)庫

2020-07-15 16:50:57

Spring BootRedisJava

2019-12-25 14:35:33

分布式架構系統(tǒng)

2019-06-19 15:40:06

分布式鎖RedisJava

2022-11-06 19:28:02

分布式鎖etcd云原生

2022-11-14 07:23:32

RedisJedis分布式鎖

2021-02-28 07:49:28

Zookeeper分布式

2023-01-13 07:39:07

2017-01-16 14:13:37

分布式數(shù)據(jù)庫
點贊
收藏

51CTO技術棧公眾號

国产黄色一区二区| 久久久成人的性感天堂| 久久久久久久久91| 在线免费观看污视频| 日韩在线伦理| 我要色综合中文字幕| 亚洲一区二区视频| 久久国产日韩欧美| 在线免费观看日韩视频| 亚洲调教视频在线观看| 亚洲小视频在线| 麻豆传媒在线看| 欧美日韩视频网站| 亚洲精品乱码久久久久久久久| 国内精品视频在线播放| ,亚洲人成毛片在线播放| 亚洲精品美女| 久久国内精品一国内精品| 国产真实乱人偷精品| **欧美日韩在线| 精品女厕一区二区三区| 精品少妇人妻av一区二区| 亚欧洲精品视频| 国产精品1区二区.| 国产黑人绿帽在线第一区| 久久免费播放视频| 99久久精品费精品国产| 亚洲欧美综合区自拍另类| 蜜臀视频在线观看| 91精品国产色综合久久不卡粉嫩| 欧美日韩免费在线| 2018中文字幕第一页| 日本精品一区二区三区在线播放| 成人久久18免费网站麻豆| 国产欧美久久久久久| 天天综合天天干| 欧美日韩1区2区3区| 色偷偷91综合久久噜噜| 舐め犯し波多野结衣在线观看| 电影一区二区在线观看| 欧美一级片免费看| 拔插拔插华人永久免费| 国外成人福利视频| 欧洲av一区二区嗯嗯嗯啊| aa在线观看视频| 美女黄色一级视频| 国内精品久久久久久野外| 久久婷婷一区二区三区| 国外成人在线视频网站| 欧美 日韩 国产 精品| 国产精品综合av一区二区国产馆| 国产欧美久久久久久| 中文字幕人妻互换av久久| 日韩精品成人一区二区三区| 欧美一级片一区| 黄色大片网站在线观看| 国产综合欧美| 久久男人av资源网站| 国产第一页在线播放| 精品91久久久久| 97视频在线观看免费高清完整版在线观看| 顶臀精品视频www| 一本到12不卡视频在线dvd| 久久影院在线观看| 久久国产精品二区| 亚洲精品婷婷| 奇米4444一区二区三区| 波多野结衣一区二区三区四区| 天堂精品中文字幕在线| 国产精品久久久久久久久久小说| 中文字字幕在线观看| 精品制服美女久久| 国产成人亚洲欧美| 天堂中文网在线| 久久精品免视看| 亚洲午夜久久久影院伊人| 欧美a免费在线| 成人免费在线观看入口| 黄色三级中文字幕| 欧美xxxhd| 欧美亚洲自拍偷拍| 四虎成人在线播放| 欧美挤奶吃奶水xxxxx| 亚洲人成电影在线观看天堂色| 成人一级片免费看| 亚洲无中文字幕| 97在线视频免费| 中文字幕一区二区人妻| 国产一二三精品| 国产三级精品在线不卡| av网站在线播放| 一区二区三区在线观看国产| 国产精品沙发午睡系列| 天天操天天摸天天爽| 国产婷婷视频在线| 亚洲妇熟xx妇色黄| 奇米影视四色在线| a级日韩大片| 在线观看视频99| 欧美黑吊大战白妞| 日本视频在线一区| 超碰97在线资源| av天在线观看| 性感美女极品91精品| 男女视频在线看| 久久综合另类图片小说| 色偷偷91综合久久噜噜| 亚洲日本韩国在线| 国产一区二区三区美女| 欧美连裤袜在线视频| aaa大片在线观看| 在线观看一区日韩| 欧类av怡春院| 午夜久久福利| 国产精品永久免费在线| 性高潮久久久久久久久久| 亚洲精品国产品国语在线app| 日韩人妻精品无码一区二区三区| 国产精一区二区| 国产香蕉一区二区三区在线视频| 黄色一级片在线| 久色婷婷小香蕉久久| 欧美成ee人免费视频| 日韩激情美女| 欧美放荡的少妇| 国产无遮挡在线观看| 国产精品毛片在线| av色综合网| 91麻豆一二三四在线| 欧美日韩国产a| 99久久人妻无码精品系列| 国产精品vip| 亚洲一区二区日本| 秋霞午夜在线观看| 欧美日韩亚州综合| 91成人精品一区二区| 久久久青草婷婷精品综合日韩| 国产伦精品一区二区三| 黄页网站在线| 日韩精品在线一区二区| 久草视频手机在线| 狠狠狠色丁香婷婷综合久久五月| 亚洲欧洲在线一区| 久久夜夜久久| 自拍偷拍亚洲欧美| 亚洲自拍偷拍色片视频| 怡红院成永久免费人全部视频| 久久久亚洲综合| 青青视频在线播放| 免费看av成人| 国产精品ⅴa在线观看h| 成人免费高清在线播放| 欧美在线你懂的| 东京热无码av男人的天堂| 青青草97国产精品免费观看无弹窗版 | 国产高清一区二区三区视频| 欧美日韩精品免费观看视频| 色偷偷男人天堂| 麻豆成人久久精品二区三区小说| 亚洲图片欧洲图片日韩av| 欧美亚洲二区| 欧美另类交人妖| 人妻一区二区三区| 欧美日韩中文字幕综合视频| 男人操女人动态图| 美女视频一区在线观看| 9l视频自拍9l视频自拍| 日本高清精品| 欧美在线视频观看| 99视频在线观看地址| 6080亚洲精品一区二区| 国产亚洲小视频| 久久久综合激的五月天| 另类小说第一页| 欧美激情日韩| 久久久久久亚洲精品不卡4k岛国 | 午夜视频一区| 久久艳妇乳肉豪妇荡乳av| 精品欧美一区二区三区在线观看| 一区二区三区精品99久久| 91久久国语露脸精品国产高跟| 亚洲精品日韩专区silk| 亚洲国产精品自拍视频| 超碰一区二区| 99久久国产免费看| 久久久久久久激情| 国产精品国内免费一区二区三区| 99理论电影网| 日本免费一区二区三区四区| 精品国产一区久久久| 亚洲卡一卡二卡三| 国产成人免费xxxxxxxx| 人人妻人人添人人爽欧美一区| 精品无人区麻豆乱码久久久| 91在线观看免费高清| 国产乱码午夜在线视频| 国产一区二区三区18| av中文在线观看| 一本色道久久综合狠狠躁的推荐 | 亚洲日本成人在线观看| 给我看免费高清在线观看| 精品一区二区三区在线播放视频 | 98色花堂精品视频在线观看| 亚洲人成网站999久久久综合| 99久久夜色精品国产亚洲| 欧美性xxxx在线播放| 日本中文字幕免费在线观看| 99久久伊人网影院| 中文字幕在线视频一区二区三区 | 欧美亚洲成人网| av理论在线观看| 中文字幕日韩欧美| 婷婷丁香一区二区三区| 91精品国产麻豆| 久久这里只有精品9| 亚洲综合免费观看高清完整版在线| 少妇无套高潮一二三区| 成人av在线资源| 一级片免费在线观看视频| 日本中文字幕一区二区视频| 久激情内射婷内射蜜桃| 亚洲一级淫片| 一区二区三区四区| 欧美呦呦网站| 欧美国产一二三区| 久久97精品| 97人人模人人爽人人喊38tv| 色999韩欧美国产综合俺来也| 国产97在线观看| 天堂在线中文网官网| 久久久久久97| 久草在线视频资源| 裸体女人亚洲精品一区| 免费黄色网页在线观看| 伊人青青综合网站| 欧美高清电影在线| 日韩av一区在线观看| 深夜福利视频网站| 精品99久久久久久| 刘亦菲毛片一区二区三区| 日韩精品一区二区三区四区| 欧美久久久久久| yourporn在线观看视频| 亚洲九九九在线观看| 外国精品视频在线观看| 亚洲黄色www| 天天综合天天综合| 日韩电影免费观看中文字幕| 午夜视频www| 精品亚洲va在线va天堂资源站| 欧美一级特黄aaaaaa| 亚洲第一精品夜夜躁人人爽| 黄色av中文字幕| 亚洲成人中文字幕| 亚洲欧美日韩综合在线| 亚洲女在线观看| 国产一区精品| 中文字幕九色91在线| 日本在线免费| 日韩视频第一页| 污片在线免费观看| 久久综合五月天| 国内高清免费在线视频| 97超级碰碰碰| 欧美暴力调教| 国产主播喷水一区二区| 玖玖精品一区| 国产一区二区高清视频| 免费成人av| 亚洲欧美日韩精品综合在线观看 | 欧美国产综合在线| 99精品热6080yy久久| 91蝌蚪视频在线观看| 久久av中文字幕片| 日本少妇一级片| 91美女福利视频| 久久久99999| 亚洲国产成人va在线观看天堂| 一级黄色免费网站| 欧美日韩国产123区| 亚洲乱码精品久久久久..| 国产婷婷色综合av蜜臀av| 在线看的av网站| 久久久久免费视频| 91tv亚洲精品香蕉国产一区| 91在线观看免费高清| 亚洲精品进入| 欧美少妇一区二区三区| 午夜在线播放视频欧美| 欧美特级aaa| a美女胸又www黄视频久久| 久久国产柳州莫菁门| 亚洲韩国精品一区| 久草视频在线免费| 亚洲第一区第二区| 999国产在线视频| 98精品国产自产在线观看| 成人在线视频免费看| 国偷自产av一区二区三区小尤奈| 久久久综合色| 亚洲国产精品久久久久婷蜜芽| 久久99精品国产.久久久久久| 中文字幕第3页| 中文字幕欧美一| 四虎精品永久在线| 久久精品超碰| 热草久综合在线| 亚洲午夜精品| 国产精品视频免费观看www| 久久国产精品美女| 日日噜噜噜噜夜夜爽亚洲精品| 黑丝一区二区| 污视频网址在线观看| 久久综合国产精品| 国产性生活网站| 91精品婷婷国产综合久久性色| 欧美婷婷久久五月精品三区| 欧美老少做受xxxx高潮| 日韩福利影视| 欧美日韩亚洲在线| 99亚洲一区二区| 中国特级黄色片| 亚洲精品一卡二卡| 怡春院在线视频| 伊人久久五月天| 欧美三区四区| 噜噜噜噜噜久久久久久91| 激情另类综合| 国产精品无码自拍| 亚洲免费在线观看| 国产又爽又黄又嫩又猛又粗| 亚洲四色影视在线观看| 午夜裸体女人视频网站在线观看| 国产激情一区二区三区在线观看| 综合一区在线| 日本高清久久久| 国产精品国产三级国产普通话99 | 精品成人免费一区二区在线播放| 激情一区二区三区| 99国产精品久久久久久久| 无码av免费精品一区二区三区| 一区二区在线观看av| 国产哺乳奶水91在线播放| 成年人精品视频| 欧洲大片精品免费永久看nba| 成人免费看片视频在线观看| 国产一区二区三区四区五区入口| 很污很黄的网站| 欧美精品 日韩| 超碰免费公开在线| 99久久精品无码一区二区毛片| 欧美视频一区| 大尺度在线观看| 欧美视频在线观看免费网址| 飘雪影院手机免费高清版在线观看| 国语自产精品视频在线看一大j8| 久久精品亚洲成在人线av网址| 免费看国产曰批40分钟| 久久丝袜美腿综合| 人人爽人人爽人人片av| 这里只有精品在线播放| 91精品视频一区二区| 在线观看17c| 99久久综合精品| 中文av免费观看| 久久五月情影视| 国产成人av毛片| 日韩精品一区二区三区不卡 | 国产在线一区二区| 久久免费视频99| 亚洲免费一级电影| 欧美高清你懂的| 久久久久久久9| 久久综合国产精品| 97人妻精品一区二区三区动漫| 欧美成人在线影院| 欧美日韩看看2015永久免费| 国产一区视频免费观看| 亚洲欧洲99久久| 欧美一级性视频| 国产高清在线不卡| 国产精品豆花视频| 日韩中文字幕电影| 制服丝袜中文字幕亚洲| 99久久精品免费看国产小宝寻花| 日本电影一区二区三区| 国产资源在线一区| 国产精品男女视频| 国产一区二区成人| 一二三区免费视频| 亚洲欧美激情在线| 头脑特工队2在线播放| 成人a免费视频| 最新成人av网站| 亚洲天堂av中文字幕| 亚洲第一天堂av| 九七电影院97理论片久久tvb| 天堂8在线天堂资源bt| 欧美国产日韩精品免费观看| 丰满熟女一区二区三区|