分布式鎖是為了解決什么問題?
首先,“分布式鎖”的概念,是相對“本地鎖”而言。
本地鎖比如java中的synchronized 關鍵字這類 JDK 自帶的 本地鎖 ,來控制一個 JVM 進程內的多個線程對本地共享資源的訪問。
同一時刻只有一個線程可以獲取到本地鎖訪問共享資源。
分布式系統(tǒng)下,不同的服務/客戶端通常運行在獨立的 JVM 進程上。如果多個 JVM 進程共享同一份資源的話,使用本地鎖就沒辦法實現資源的互斥訪問了。于是,分布式鎖 就誕生了。
分布式鎖需要滿足什么條件?
- 互斥:任意一個時刻,鎖只能被一個線程持有;
- 高可用:(啥意思?)鎖服務是高可用的。并且,即使客戶端的釋放鎖的代碼邏輯出現問題,鎖最終一定還是會被釋放,不會影響其他線程對共享資源的訪問。
- 可重入:一個節(jié)點獲取了鎖之后,還可以再次獲取鎖。(有什么用?)
如何基于 Redis 實現一個最簡易的分布式鎖?(沒看懂)
用SETNX(SET if Not eXists)命令實現”互斥“。
SETNX lockKey uniqueValue
(integer) 1
SETNX lockKey uniqueValue
(integer) 0
分布式鎖會有不被釋放的問題嗎?怎么解決?
會,設置過期時間。
127.0.0.1:6379> SET lockKey uniqueValue EX 3 NX
OK
lockKey:加鎖的鎖名;
uniqueValue:能夠唯一標示鎖的隨機字符串;
NX:只有當 lockKey 對應的 key 值不存在的時候才能 SET 成功;
EX:過期時間設置(秒為單位)EX 3 標示這個鎖有一個 3 秒的自動過期時間。與 EX 對應的是 PX(毫秒為單位),這兩個都是過期時間設置。
如何實現鎖的優(yōu)雅續(xù)期?
對于 Java 開發(fā)的小伙伴來說,已經有了現成的解決方案:Redisson
什么是可重入鎖?
可重入鎖指的是在一個線程中可以多次獲取同一把鎖,比如一個線程在執(zhí)行一個帶鎖的方法,該方法中又調用了另一個需要相同鎖的方法,則該線程可以直接執(zhí)行調用的方法即可重入 ,而無需重新獲得鎖。像 Java 中的 synchronized 和 ReentrantLock 都屬于可重入鎖。
不可重入的分布式鎖基本可以滿足絕大部分業(yè)務場景了,一些特殊的場景可能會需要使用可重入的分布式鎖。文章來源:http://www.zghlxwxcb.cn/news/detail-464247.html
實際項目中,我們不需要自己手動實現,推薦使用我們上面提到的 Redisson ,其內置了多種類型的鎖比如可重入鎖(Reentrant Lock)文章來源地址http://www.zghlxwxcb.cn/news/detail-464247.html
到了這里,關于redis如何實現分布式鎖?的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!