Redis實現分布式鎖的原理分析

上一篇 <<<Redis的過期機制使用場景示例
下一篇 >>>Redis分布式鎖的實現代碼示例


分布式鎖的概念

本地鎖:在多個線程中,保證只有一個線程執行(線程安全的問題)
分布鎖:在分布式中,保證只有一個jvm執行(多個jvm線程安全問題)
如果我們服務器是集群的時候,定時任務可能會重復執行 可以采用分布式鎖解決

分布式鎖的實現方案

a、基于數據庫方式實現
b、基于Zk方式實現 采用臨時節點+事件通知
c、基于Redis方式實現 setnx 方式
d、基于Redisson方式實現

分布式鎖的應用場景

1.分布式任務調度平臺保證任務的冪等性。
2.分布式全局id的生成

Redis實現分布式鎖的思路

Redis實現分布式鎖基于SetNx命令,因為在Redis中key是保證是唯一的。所以當多個線程同時的創建setNx時,只要誰能夠創建成功誰就能夠獲取到鎖。
獲取鎖
核心:多個不同的jvm 同時創建一個相同的標記(全局唯一的) 只要誰能夠創建成功誰就能夠獲取鎖
redis:創建一個相同的標記使用Setnx命令,因為Redis key必須保證是唯一的,只要誰能夠創建成功誰就能夠獲取鎖
釋放鎖
核心:釋放該全局唯一的標記,其他的jvm重新進入到獲取鎖資源。
redis:對key設置一個有效期(可避免死鎖),或者主動刪除該key
超時鎖(沒有獲取鎖、已經獲取鎖)
a、設置等待獲取鎖的超時時間
b、已經獲取到鎖,設置鎖的有效期5s

在分布式鎖中如果超時了如何處理

設置獲取鎖和使用鎖的超時時間。
redis分布式鎖判斷超時的時候,只要計算執行時間就可以了,不用去redis里判斷一下key是否存在。

如何提高分布式鎖的效率

a、降低鎖的粒度(沒必要的放在鎖之外,業務邏輯盡可能的簡單)
b、不同的業務使用不同的鎖,不要全部使用同一把鎖

Redis中SetnX與Set命令的區別

Set命令的時候:如果key不存在則創建,如果key已經存在則修改原值;
SetNx命令: 如果key不存在則創建 返回1,如果已經存在則不執行任何操作返回0

ZK的分布式鎖參考后續提供的文章內容。。。


推薦閱讀:
<<<分布式緩存與本地緩存的區別
<<<Ehcache基礎知識
<<<SpringBoot整合Ehcache
<<<Redis的5種數據類型
<<<Redis存放實體對象的方式及區別
<<<Redis的應用場景匯總
<<<Redis高效及線程安全的真正原因
<<<Redis為啥要分為16個庫
<<<RDB和AOF持久化方式的區別
<<<Redis與數據庫的一致性解決方案
<<<SpringBoot整合Redis的注解版本完成數據緩存
<<<Redis的淘汰策略
<<<Redis的事務操作(Mult和Watch)知識點
<<<Redis的過期機制使用場景示例
<<<Redis分布式鎖的實現代碼示例
<<<使用Redisson工具實現分布式鎖
<<<Redis集群模式之主從復制原理及存在的缺陷
<<<Redis集群模式之哨兵模式
<<<Redis集群模式之Cluster去中心化分片集群
<<<Linux環境下安裝單機Redis
<<<Redis Cluster集群環境搭建
<<<Redis Cluster如何動態擴容與縮容
<<<Redis Cluster主從節點自動切換
<<<Redis集群模式的類型和缺陷匯總
<<<Redis緩存的穿透、擊穿和雪崩效應
<<<Redis解決穿透擊穿問題時使用的布隆過濾器知識點
<<<Redis與MySQL的數據同步解決方案
<<<阿里云的Canal框架實現Redis與Mysql同步原理及代碼示例
<<<阿里云的Canal框架配置
<<<Redis官方提出的redlock分布式鎖
<<<Redis的調優設置
<<<Redis常見問題匯總

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容