最近面試被問道了一些分布式鎖相關的問題,今天打算好好把分布式鎖的問題看一下
1.先看一下簡單的扣庫存的例子
這個是最基礎的扣庫存的例子,在併發問題下肯定是有問題的,有些人可能會說,加個syn或者lock鎖不就好咯,但是這面我要說
你想多了吧,syn和lock鎖時執行緒級別的鎖,我們現在的專案都是多個節點部署的,都是多程序的,你這個鎖時沒有用的,下面我們就要來看看我們分布式專案常用的分布式鎖的實現來解決這個問題.
2.學習redis的分布式鎖,我們先學習這個命令set
redis setnx(setifnot exists) 命令在指定的 key 不存在時,為 key 設定指定的值,設定相同的key只有第一次會成功。
3.我們利用setnx來實現乙個簡單版的分布式鎖:
4.可以思考下這個實現有什麼問題:
比如剛好第乙個執行緒執行了setnx,設定過期時間為10s命令,但是此時程式執行的異常的慢,全部**執行完需要15s,你還沒執行完你這個key就過期了,剛好第二個執行緒執行setnx,第乙個執行緒就會把第二個執行緒的鎖key刪除了,這就徹底亂套了啊、
5.有什麼解決方案呢?
1.執行緒設定完setnx之後開啟乙個分執行緒,開啟乙個定時器,每隔一段時間(超時時間的三分之一)檢查自己設定的這個鎖的key是否還存在,給他延時,續命等
2.用redission
6.利用redission實現分布式鎖
原理以後接著分析......
分布式鎖 使用Redis實現分布式鎖
關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...
redis實現分布式鎖
隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...
redis實現分布式鎖
分布式鎖可以基於很多種方式實現,比如zookeeper redis.不管哪種方式,他的 基本原理是不變的 用乙個狀態值表示鎖,對鎖的占用和釋放通過狀態值來標識。1 使用redis的setnx命令實現分布式鎖 1 實現的原理 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多客戶...