redis 處理socket ready 事件是單執行緒執行的, 也就是說redis一次只會處理乙個socket, 避免了併發所帶來的資源競爭問題, 可以用來實現分布式鎖.
具體實現思路: 通過setnx嘗試設值(currenttimestamp + timeout), 如果設定成功, 說明類似獲取鎖操作成功, 失敗則獲鎖失敗. 獲鎖成功的執行緒在處理完業務之後要手動釋放鎖del key. 由於各種不穩定因素的存在會導致獲鎖客戶端無法釋放鎖, 會造成死鎖, 比如服務宕機, 網路延遲等原因. 因此在setnx失敗後, 需要get獲取val既currenttimestamp + timeout 判斷當前時間是否大於該值, 大於說明此鎖已無效, 要麼del, 要麼重新set, del的話存在問題,如果直接del key, 再setnx, 在併發情況下會導致setnx成功後被後乙個執行緒del, 因此建議使用getset, 通過比較返回值和get 獲取的舊值比較, 相同則說明獲取成功, 失敗則說明已被其他執行緒獲取成功.
由於處理業務時間可能較長, 導致鎖被認為invalid, 因此需要在處理過程中檢測currenttimestamp + timeout, 重新設定此值.
redis實現分布式鎖思路
1.利用redis的setnx命令 setnx name value 如果對應的name沒有被設定過,則會設定成功,如果設定過,則返回失敗。2.expire命令 可以對name設定過期時間,防止持有鎖的執行緒因為意外情況掛掉,導致業務阻塞。3.redis是單執行緒的機制。ps 第二條中expire命...
分布式鎖 使用Redis實現分布式鎖
關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...
redis實現分布式鎖
隨便 系統越來越大,各功能模組除了垂直切割以外,同時也得做集群處理,那麼問題來了,在多執行緒情況下對於資源的競爭就需要乙個統一的訪問限制。以選課系統為例子,集群中各節點對課程可選數量同時操作,這裡就需要同步了,否則會導致最後選到的數量比可選的數量大,這裡我們的分布式鎖就派上用場了。利用redis來實...