RedLock

      網友投稿 549 2025-04-05

      概念


      Redis 官方站這篇文章提出了一種權威的基于 Redis 實現分布式鎖的方式名叫?Redlock,此種方式比原先的單節點的方法更安全。它可以保證以下特性:

      安全特性:互斥訪問,即永遠只有一個 client 能拿到鎖

      避免死鎖:最終 client 都可能拿到鎖,不會出現死鎖的情況,即使原本鎖住某資源的 client crash 了或者出現了網絡分區

      容錯性:只要大部分 Redis 節點存活就可以正常提供服務

      單節點實現

      SET resource_name my_random_value NX PX 30000

      主要依靠上述命令,該命令僅當 Key 不存在時(NX保證)set 值,并且設置過期時間 3000ms (PX保證),值 my_random_value 必須是所有 client 和所有鎖請求發生期間唯一的,釋放鎖的邏輯是:

      if redis.call("get",KEYS[1]) == ARGV[1] then

      return redis.call("del",KEYS[1])

      else

      return 0

      end

      上述實現可以避免釋放另一個client創建的鎖,如果只有 del 命令的話,那么如果 client1 拿到 lock1 之后因為某些操作阻塞了很長時間,此時 Redis 端 lock1 已經過期了并且已經被重新分配給了 client2,那么 client1 此時再去釋放這把鎖就會造成 client2 原本獲取到的鎖被 client1 無故釋放了,但現在為每個 client 分配一個 unique 的 string 值可以避免這個問題。至于如何去生成這個 unique string,方法很多隨意選擇一種就行了。

      redlock算法

      算法很易懂,起 5 個 master 節點,分布在不同的機房盡量保證可用性。為了獲得鎖,client 會進行如下操作:

      得到當前的時間,微秒單位

      嘗試順序地在 5 個實例上申請鎖,當然需要使用相同的 key 和 random value,這里一個 client 需要合理設置與 master 節點溝通的 timeout 大小,避免長時間和一個 fail 了的節點浪費時間

      RedLock

      當 client 在大于等于 3 個 master 上成功申請到鎖的時候,且它會計算申請鎖消耗了多少時間,這部分消耗的時間采用獲得鎖的當下時間減去第一步獲得的時間戳得到,如果鎖的持續時長(lock validity time)比流逝的時間多的話,那么鎖就真正獲取到了。

      如果鎖申請到了,那么鎖真正的 lock validity time 應該是 origin(lock validity time) - 申請鎖期間流逝的時間

      如果 client 申請鎖失敗了,那么它就會在少部分申請成功鎖的 master 節點上執行釋放鎖的操作,重置狀態

      失敗重試

      如果一個 client 申請鎖失敗了,那么它需要稍等一會在重試避免多個 client 同時申請鎖的情況,最好的情況是一個 client 需要幾乎同時向 5 個 master 發起鎖申請。另外就是如果 client 申請鎖失敗了它需要盡快在它曾經申請到鎖的 master 上執行 unlock 操作,便于其他 client 獲得這把鎖,避免這些鎖過期造成的時間浪費,當然如果這時候網絡分區使得 client 無法聯系上這些 master,那么這種浪費就是不得不付出的代價了。

      放鎖

      放鎖操作很簡單,就是依次釋放所有節點上的鎖就行了

      性能、崩潰恢復

      如果我們的節點沒有持久化機制,client 從 5 個 master 中的 3 個處獲得了鎖,然后其中一個重啟了,這是注意?整個環境中又出現了 3 個 master 可供另一個 client 申請同一把鎖!?違反了互斥性。如果我們開啟了 AOF 持久化那么情況會稍微好轉一些,因為 Redis 的過期機制是語義層面實現的,所以在 server 掛了的時候時間依舊在流逝,重啟之后鎖狀態不會受到污染。但是考慮斷電之后呢,AOF部分命令沒來得及刷回磁盤直接丟失了,除非我們配置刷回策略為 fsnyc = always,但這會損傷性能。解決這個問題的方法是,當一個節點重啟之后,我們規定在 max TTL 期間它是不可用的,這樣它就不會干擾原本已經申請到的鎖,等到它 crash 前的那部分鎖都過期了,環境不存在歷史鎖了,那么再把這個節點加進來正常工作。

      Redis

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Excel連環引用法怎么轉二維表為一維表(excel 二維表轉一維表)
      下一篇:零代碼平臺優勢(加速業務流程自動化和創新)
      相關文章
      欧洲 亚洲 国产图片综合| 亚洲精品综合久久中文字幕| 亚洲国产美女视频| 亚洲国产成人久久综合一| 亚洲色精品88色婷婷七月丁香 | MM1313亚洲精品无码久久| 亚洲人av高清无码| 亚洲中文字幕一二三四区| 亚洲中文字幕无码mv| 亚洲欧美aⅴ在线资源| 亚洲色大成网站www尤物| 亚洲人成色777777精品| 亚洲精品日韩一区二区小说| 亚洲精品无码专区在线| 亚洲精品无码av中文字幕| 亚洲欧美日韩中文二区| 亚洲爆乳AAA无码专区| 校园亚洲春色另类小说合集| va亚洲va日韩不卡在线观看| 日韩精品亚洲专区在线观看| 亚洲国产精品成人久久蜜臀| 色综合久久精品亚洲国产| 国产成人综合亚洲绿色| 亚洲а∨天堂久久精品| 国产亚洲精久久久久久无码AV| 国产亚洲精品福利在线无卡一| 亚洲精品无码久久一线| 亚洲av无码国产精品色午夜字幕| 亚洲精品视频在线| 亚洲精品视频免费看| 亚洲国产精品综合久久20| 亚洲综合精品伊人久久| 色偷偷亚洲男人天堂| 亚洲天堂免费在线视频| 国产亚洲精久久久久久无码| 亚洲欧洲日韩不卡| 亚洲国产精品成人久久久| 亚洲中文无码永久免| 亚洲精品成人久久久| 亚洲精品无码不卡在线播HE| 99人中文字幕亚洲区|