技術分享 | Redis 之分散式鎖
愛可生研發中心工程師,負責專案的需求與維護工作。其他身份:柯基鏟屎官。
*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。
引言:之前的一篇《快取穿透 - Redis Module之布隆過濾器》中,介紹了布隆過濾器的使用,本篇主要透過實際業務場景來講述 Redis 中關於分散式鎖與 Red lock 的相關內容。
一、什麼是分散式鎖
如果不同的系統或是同一個系統的不同主機之間共享了一個或一組資源,那麼訪問這些資源的時候,往往需要互斥來防止彼此干擾來保證一致性,這個時候,便需要使用到分散式鎖。
二、場景案例
三、使用Redis實現分散式鎖
3.1 帶TTL的key
即:
get->不存在,獲取成功->set->ttl->del
3.2 setNX
set key value px milliseconds nx
3.3 setNX + Lua
在3.2中還存在一個問題,例如:
ATM-A 獲取鎖成功 ATM-A 操作中,持續阻塞 設定 key 過期了,鎖被自動釋放 ATM-B 獲取到鎖 ATM-A 操作此時恢復處理,操作完成開始釋放鎖 ATM-B 持有的鎖被 ATM-A 釋放掉了
同樣的,get->delete 操作並不是原子性的,需要使用 lua 指令碼來同時完成:
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
3.4 鎖的續期
3.5 高可用問題
會出現以下的問題:
ATM-A 從 Redis master 節點獲取到鎖 在 master 將鎖同步到 slave 之前,master 當機 slave 節點被晉級為 master 節點 ATM-B 獲取到了鎖,ATM-A 業務還在進行中,導致安全失效
四、Redis Module - RedLock
官方文件: 使用方式:
4.1 獲取鎖:
4.2 釋放鎖:
4.3 延遲重啟:
4.4 優點:
有效防止單點故障
4.5 缺點:
需要維護多臺 Redis Master ,使用起來相當笨重 RedLock 演算法對時鐘依賴性強,若叢集中的某個節點發生時鐘異常問題,可能會因此而引發鎖安全性問題 如果有節點發生崩潰重啟,還是會對鎖的安全性有影響的。具體的影響程度跟 Redis 對資料的持久化程度有關
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2930744/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分散式鎖之Redis實現分散式Redis
- 十九、Redis分散式鎖、Zookeeper分散式鎖Redis分散式
- 分散式鎖-Redis分散式Redis
- Redis 分散式鎖Redis分散式
- Redis分散式鎖Redis分散式
- 得物技術淺談深入淺出的Redis分散式鎖Redis分散式
- Redis 分散式鎖(一)Redis分散式
- Redis分散式鎖解析Redis分散式
- redis系列:分散式鎖Redis分散式
- redis分散式鎖-可重入鎖Redis分散式
- Redis分散式鎖加鎖案例Redis分散式
- 再談分散式鎖之剖析Redis實現分散式Redis
- 分散式鎖(1):Java 常用技術方案分散式Java
- 細說Redis分散式鎖?Redis分散式
- Redis分散式鎖實戰Redis分散式
- 分散式鎖----Redis實現分散式Redis
- Redis 應用-分散式鎖Redis分散式
- Redis實現分散式鎖Redis分散式
- 基於 Redis 分散式鎖Redis分散式
- 詳解Redis分散式鎖Redis分散式
- 【Redis】利用 Redis 實現分散式鎖Redis分散式
- 技術分享| 基於 Etcd 的分散式鎖實現原理及方案分散式
- 分散式之抉擇分散式鎖分散式
- 搞懂分散式技術16:淺談分散式鎖的幾種方案分散式
- Redis面試系列:Redis實現分散式鎖Redis面試分散式
- Redis之分散式鎖實現Redis分散式
- redis分散式鎖-java實現Redis分散式Java
- Redis如何實現分散式鎖Redis分散式
- Redis分散式鎖解決方案Redis分散式
- Redis 分散式鎖解決方案Redis分散式
- 分散式鎖--Redis小試牛刀分散式Redis
- 分散式鎖實現(一):Redis分散式Redis
- 利用Redis實現分散式鎖Redis分散式
- redis分散式鎖的實現Redis分散式
- 基於 Redis 的分散式鎖Redis分散式
- 基於redis的分散式鎖Redis分散式
- redis分散式鎖-SETNX實現Redis分散式
- 使用 Redis 實現分散式鎖Redis分散式