国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Redis應用篇(眾星追月):分布式鎖

存儲 存儲軟件 分布式 Redis
由于分布式系統「多線程」、「多進程」并且「分布在不同機器」上,這將使原單機并發控制鎖策略失效,為了解決這個問題就需要一種「跨JVM的互斥機制」來控制共享資源的訪問,這就得靠分布式鎖啦。

[[431326]]

話題引入

大家好,我是小龍。

之前在《吃透Redis系列》專欄發表了第一篇文章《Redis基礎篇(萬丈高樓平地起):核心底層數據結構》簡單介紹了Redis,以及它的內部組織形式、核心數據結構與大致使用場景。還沒看到得同學可以回過頭看看。

接下來,我將繼續帶大家深入理解,本文將介紹Redis高頻使用的一個場景——「利用Redis實習分布式鎖」。

想必大家都知道,在遇到并發問題時,我們通常會使用鎖來解決并發問題。

這是,有同學可能說:“這個我會,不就用synchronized、Lock這些實現嗎?”

對,你說的不錯。但是你只說對了一半,在「傳統單機部署」的情況下,可以使用Java并發處理相關的API(如ReentrantLcok或synchronized)進行互斥控制。

但是在「分布式系統」中,由于分布式系統「多線程」、「多進程」并且「分布在不同機器」上,這將使原單機并發控制鎖策略失效,為了解決這個問題就需要一種「跨JVM的互斥機制」來控制共享資源的訪問,這就得靠分布式鎖啦。

看透鎖本質

在我看來:所有的鎖本身都可以用一個變量來表示。

比如:在「單機上運行」的多線程程序來說。取一個變量,變量為0時,表示沒有線程獲取鎖;變量為1時,表示已經有線程獲取鎖。

加鎖:線程調用加鎖操作,檢查變量是否為0,如果為0,表示沒線程獲取鎖,將變量設置為1,表示獲取鎖;如果不是0,表示其他線程已經暫用鎖,獲取鎖失敗。

解鎖:同理。

而分布式環境下,同樣可以以變量形式理解分布式鎖。

但是,和線程在單機上操作鎖不同的是,在分布式場景下,「鎖變量需要由一個共享存儲系統來維護」,只有這樣,多個客戶端才可以通過訪問共享存儲系統來訪問鎖變量。相應的,「加鎖和釋放鎖的操作就變成了讀取、判斷和設置共享存儲系統中的鎖變量值」。

「可見,滿足分布式鎖的要求」:

  • 「鎖操作原子性」:分布式鎖的加鎖和釋放鎖的過程,涉及多個操作。所以,在實現分布式鎖時,我們需要保證這些「鎖操作的原子性」;
  • 「鎖的可靠性」:共享存儲系統保存了鎖變量,如果共享存儲系統發生故障或宕機,那么客戶端也就無法進行鎖操作了。在實現分布式鎖時,我們需要考慮保證「共享存儲系統的可靠性」,進而保證「鎖的可靠性」。

上面我們提到了可以使用一個鎖變量來表示鎖,其實你也可以理解為「占位」。只不過分布式鎖需要把這個坑位拿出來放于「共享」的地方,每個都從「共享處來檢查坑位」。

占位一般是使用 setnx(set if not exists) 指令,只允許被一個客戶端占位。先來先占, 用完了,再調用 del 指令釋放茅坑。

  1. //加鎖 
  2. > setnx lock_key 1 
  3. OK 
  4. //業務邏輯 
  5. >(其他操作) 
  6. //釋放鎖 
  7. > del lock_key 

但是有個問題,如果邏輯執行到中間出現異常了,可能會導致 del 指令沒有被調用,這樣就會「陷入死鎖」,鎖永遠得不到釋放。

于是我們在拿到鎖之后,再給鎖加上一個過期時間,這樣即使中間出現異常也可以保證指定時間之后鎖會自動釋放。

  1. //加鎖 
  2. > setnx lock_key 1 
  3. OK 
  4. > expire lock_key 5 
  5. //業務邏輯 
  6. >(其他操作) 
  7. //釋放鎖 
  8. > del lock_key 

但是以上邏輯還有問題。如果在 setnx 和 expire 之間服務器進程突然掛掉了,可能是因為機器掉電或者是被人為殺掉的,就會導致 expire 得不到執行,也會造成死鎖。

這種問題的根源就在于 setnx 和 expire 是兩條指令而不是原子指令。你也許會想到使用事務什么的執行,但是這里不行,因為如果 setnx 沒搶到鎖,expire 是不應該執行的。

Redis 2.8 版本中作者加入了 set 指令的擴展參數,使得 setnx 和expire 指令可以一起執行,徹底解決了分布式鎖的亂象。

  1. set key value [EX seconds | PX milliseconds] [NX] 

除了上述基本常規的問題,還有這些「你可能沒考慮到的問題」:

超時問題

Redis 的分布式鎖不能解決超時問題,如果在加鎖和釋放鎖間的業務邏輯執行時間太長,以至于超出了鎖的超時限制,就會出現問題(也就是鎖過期了,你的業務邏輯還沒執行完)。

因為這時候鎖過期了,第二個客戶端B重新持有了這把鎖,但是緊接著客戶端A執行完了業務邏輯,就把鎖給釋放了,客戶端C就會在客戶端B邏輯執行完之間拿到了鎖。為了避免這個問題,Redis 分布式鎖不要用于較長時間的任務。

為了應對這個問題,我們需要能區分來自不同客戶端的鎖操作,具體咋做呢 ? 針對于這個問題,我們可以想辦法把命令略加點小技巧。可以在鎖變量的值上想想辦法。

在使用SETNX命令進行加鎖的方法中,我們通過把鎖變量值設置為1或0,表示是否加鎖成功。1和0只有兩種狀態,無法表示究竟是哪個客戶端進行的鎖操作。

所以,我們在加鎖操作時,可以「讓每個客戶端給鎖變量設置一個唯一值」,這里的唯一值就可以用來標識當前操作的客戶端。

在釋放鎖操作時,客戶端需要判斷,當前「鎖變量的值是否和自己的唯一標識相等」,只有在相等的情況下,才能釋放鎖。這樣一來,就不會出現誤釋放鎖的問題了。

于是,我們的命令可以這樣寫:

  1. //加鎖,unique_value作為客戶端唯—性的標識 
  2. SET lock_key unique_value NX PX 5000 

其中,unique_value 是客戶端的唯一標識,可以用一個隨機生成的字符串來表示,PX 5000則表示 lock_key會在5s后過期,以免客戶端在這期間發生異常而無法釋放鎖。

因為在加鎖操作中,每個客戶端都使用了一個唯一標識,所以在「釋放鎖操作」時,我們需要「判斷鎖變量的值」,是否等于執行釋放鎖操作的客戶端的唯一標識,如下所示,可以使用Lua腳本來保證原子性:

  1. //釋放鎖比較unique_value是否相等,避免誤釋放 
  2. if redis.call("get" ,KEYS[1])== ARGV[1] then 
  3.  return redis.call("del" , KEYS[1]) 
  4. else 
  5.  return 0 
  6. end 

可重入性

可重入性是指線程在持有鎖的情況下再次請求加鎖,如果一個鎖支持同一個線程的多次加鎖,那么這個鎖就是可重入的。比如 Java 語言里有個 ReentrantLock 就是可重入鎖。

Redis 分布式鎖如果要支持可重入,可以對客戶端的 set 方法進行包裝,使用線程的 Threadlocal 變量存儲當前持有鎖的計數。

此處就不過多介紹,大抵不會問,有興趣可以自己上網查閱看書。

課外補充

上述內容,是個基于單個Redis節點實現分布式鎖。

當我們要實現「高可靠的分布式鎖」時,就不能只依賴單個的命令操作了,我們需要按照一定的步驟和規則進行加解鎖操作,否則,就可能會出現鎖無法工作的情況。“一定的步驟和規則”是指啥呢?其實就是分布式鎖的算法。

這里簡單介紹Redlock算法的執行步驟。Redlock算法的實現需要有N個獨立的Redis實例。接下來,我們可以分成3步來完成加鎖操作。

1、客戶端獲取當前時間

2、客戶端按照順序在每個Master實例中嘗試獲得鎖。在獲得鎖的過程中,為每一個鎖操作設置一個快速失敗時間(如果想要獲得一個10秒的鎖,那么每一個鎖操作的失敗時間設為5-50ms)。

這樣可以避免客戶端與一個已經故障的Master通信占用太長時間,通過快速失敗的方式盡快的與集群中的其他節點完成鎖操作。

3、客戶端計算出與master獲得鎖操作過程中消耗的時間,「當且僅當Client獲得鎖消耗的時間小于鎖的存活時間,并且在一半以上的master節點中獲得鎖」。才認為client成功的獲得了鎖。

4、如果已經獲得了鎖,「Client執行任務的時間窗口是鎖的存活時間減去獲得鎖消耗的時間。」

 

5、如果Client獲得鎖的數量不足一半以上,或獲得鎖的時間超時,那么認為獲得鎖失敗。客戶端「需要嘗試在所有的master節點中釋放鎖, 即使在第二步中沒有成功獲得該Master節點中的鎖,仍要進行釋放操作。」

 

責任編輯:武曉燕 來源: 小龍coding
相關推薦

2019-06-19 15:40:06

分布式鎖RedisJava

2023-08-21 19:10:34

Redis分布式

2022-01-06 10:58:07

Redis數據分布式鎖

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2024-10-07 10:07:31

2022-09-19 08:17:09

Redis分布式

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2021-06-16 07:56:21

Redis分布式

2024-04-01 05:10:00

Redis數據庫分布式鎖

2019-07-16 09:22:10

RedisZookeeper分布式鎖

2022-06-16 08:01:24

redis分布式鎖

2023-01-13 07:39:07

2021-07-26 11:09:46

Redis分布式技術

2020-07-15 16:50:57

Spring BootRedisJava

2020-07-30 09:35:09

Redis分布式鎖數據庫

2021-03-10 09:54:06

Redis分布式

2023-03-01 08:07:51

2022-07-22 06:55:20

Redis分布式鎖

2022-11-14 07:23:32

RedisJedis分布式鎖

2022-03-08 15:24:23

BitMapRedis數據
點贊
收藏

51CTO技術棧公眾號

不卡视频在线看| 老司机aⅴ毛片免费观看| 中文字幕在线观看第一页| av大全在线| 久久综合色占| 欧美性xxxxx极品娇小| 日韩亚洲欧美精品| 欧美一区二区三区红桃小说| 国产亚洲精品久久久久久| 日本免费视频在线观看| 日本免费新一区视频| 精品成人私密视频| 人人妻人人澡人人爽欧美一区双| sm久久捆绑调教精品一区| 91首页免费视频| 亚洲精品av在线| 午夜精品爽啪视频| 国产精品国产福利国产秒拍| 一本大道色婷婷在线| 天天免费综合色| 欧美美女黄色网| 亚洲自拍偷拍网| 国内精品久久久久久久| 欧美韩日亚洲| 亚洲色图制服丝袜| 成人免费观看视频在线观看| 国产一区二区电影| 欧美大片一区二区三区| 成人免费激情视频| 啦啦啦在线视频免费观看高清中文 | 亚洲视频www| 精品91自产拍在线观看一区| 色开心亚洲综合| 日产精品久久久一区二区| 欧美男人天堂| 亚洲欧美综合v| 精品亚洲成人| 69堂国产成人免费视频| 欧美国产激情视频| 亚洲欧美一区二区三区四区| av电影免费| av文字幕在线观看| 亚洲国产精品久久久久秋霞不卡| 亚洲天堂导航| 97超碰国产精品女人人人爽| 欧美一区二区三区另类| 欧美一区二区视频在线| 国产东北露脸精品视频| 蜜桃特黄a∨片免费观看| 日韩欧美在线播放| 成人免费短视频| 欧美亚洲国产另类| 亚洲一级在线| 男女无套免费视频网站动漫| 性做久久久久久久免费看| 一区二区久久| 九九精品视频在线| 国产精品动漫网站| 蜜桃视频免费观看一区| 久久人人爽人人爽人人片亚洲| 欧美14一18处毛片| 亚洲精品视频网上网址在线观看| 久久毛片亚洲| 亚洲成avwww人| 周于希免费高清在线观看| 日韩精品一区二区三区视频| 嫩草伊人久久精品少妇av杨幂| 一本久道久久久| 日本成人在线不卡| 亚洲欧美日本韩国| 青草视频在线免费直播| 性欧美视频videos6一9| 久久青草久久| 黄色免费观看网站| 亚洲美女性生活视频| 日韩一区电影| 欧美在线一区二区| 亚洲一区导航| 国产一区免费| 中文字幕永久在线不卡| av剧情在线观看| 国产成人av在线| 美女视频黄免费的久久| 最全影音av资源中文字幕在线| 亚洲欧美激情一区| 亚洲情侣在线| 欧美精品性生活| 精品盗摄一区二区三区| 日韩免费看片| 97cao在线| 伊人久久久久久久久久久| 欧美婷婷在线| 亚洲精品666| 欧美精品videosex牲欧美| 久久97超碰国产精品超碰| 久热av在线| 欧美诱惑福利视频| 99精品热视频| 日本蜜桃在线观看视频| 国产精品9999久久久久仙踪林| 久久久精品2019中文字幕之3| 美女高潮在线观看| 久久香蕉综合色| 五月婷婷久久丁香| 里番精品3d一二三区| 久久男人资源站| 欧美男生操女生| 美女国产精品| 久草在线青青草| 久久夜色精品国产亚洲aⅴ| 美女mm1313爽爽久久久蜜臀| 性欧美孕妇孕交| 国产欧美日韩中文字幕| 欧美日韩国产精品专区| aiss精品大尺度系列| 午夜激情av在线| 欧洲亚洲在线视频| 菠萝蜜视频在线观看www入口| 九九热精品视频| 亚洲成人av一区| a视频在线播放| 日韩中文字幕在线| 艳女tv在线观看国产一区| 一区二区三区在线观看www| 精品久久久影院| av在线免费不卡| 亚洲调教一区| 在线观影网站| 国产精品激情自拍| 亚洲欧美日韩精品久久| 久久久久99精品久久久久| 情趣视频网站在线免费观看| 久久久久久国产免费 | 相泽南亚洲一区二区在线播放| 午夜a成v人精品| 午夜电影亚洲| 色婷婷精品视频| 日韩一区二区三区视频在线观看| 亚洲一级网站| 免费黄色在线网站| 欧美日韩一区综合| 欧美大片一区二区| 国产一区二区不卡老阿姨| 激情都市亚洲| 777久久久精品一区二区三区| 欧美成人自拍视频| 国产精品免费看片| 国产精品自拍区| 国产传媒在线视频| 中文字幕高清不卡| 亚洲国产91视频| 国产免费人做人爱午夜视频| 97av在线播放| 精品人伦一区二区三区蜜桃免费| 你懂的成人av| 久久www人成免费看片中文| 国产爆乳无码一区二区麻豆| 久久综合网hezyo| 国产精品久久久久9999吃药| 国产高清一区二区| 2021国产在线| www.亚洲天堂网| 国产欧美日韩视频| 欧美大胆人体bbbb| 久久毛片高清国产| 97色伦图片97综合影院| 女人黄色免费在线观看| 不卡影院一区二区| 亚洲一区二区免费| 亚洲人成电影在线观看天堂色| 欧美精品少妇videofree| 日韩精品一区二区三区视频在线观看 | 手机在线一区二区三区| 国精产品一区一区三区mba下载| fc2人成共享视频在线观看| 成年人免费大片| 激情图片qvod| 国产最新免费视频| 男人天堂999| 黄色a级片免费| 成人在色线视频在线观看免费大全 | 日韩一区二区三区免费| 91短视频在线观看| 97在线观看| 在线宅男视频| www黄在线观看| 激情开心成人网| 草草视频在线| 四季久久免费一区二区三区四区| 国产福利电影网| 久草在线资源视频在线观看| 欧美v在线观看| 狼狼综合久久久久综合网| 美日韩丰满少妇在线观看| 国产视频精品va久久久久久| 欧美一级日韩免费不卡| 少妇av一区二区三区| 欧美日韩成人网| 91免费观看网站| 最近中文字幕一区二区|