首先設定上鎖的方式,用setnx(lockkey,currenttime+timout)來表示設定鎖,其中lockkey為我們所需要爭取到的鎖,value值則由當前時間和設定的超時時間組成。
當我們爭取到鎖後,進行常規操作即可,接下來我們討論競爭鎖失敗後的優化。
首先我們去得到lockkey的value值,接下來進入第乙個判斷條件:
若這個值不為空,且當前時間的值是大於這個數值的,則代表這個鎖已經超時了,並可能之前獲得鎖的操作出現了異常(比如突然關掉tomcat),導致redis中的鎖expire值為-1,而沒被釋放,此時代表我是可以再次獲取到鎖的。
於是接著執行getset(lockkey.currenttime + timeout),重新設定鎖的value值,此處用到getset將會返回舊值lockvalueb,是為了進一步確保鎖的安全,比如又有其他tomcat拿到鎖了。
接著判斷lockvalueb,
1. 若為空,代表lockkey已經沒有了(可能是已經被釋放),所以可以正常拿到鎖;
2. 若跟lockvaluea相等,則代表在兩個菱形判斷條件過程中,沒有其他服務過來爭取鎖,而lockkey是已經處於超時的狀況,因而也可以正常去獲取鎖。
這樣加雙重判斷就能有效防止死鎖。
單機redis分布式鎖實現原理解析
使用者通過http請求可以通知任務中心結束掉自己傳送的任務,這時候任務中心會通過mq通知結束服務去結束任務儲存資料,由於任務結束資料計算儲存有一定延時,所以存在使用者短時間內多次結束同乙個任務,這時候就會導致我們結束服務對同乙個任務儲存多次資料。恰好我們也是用了redis,所以對於這個問題我當時想到...
Redis分布式鎖解析
原文 blog.csdn.net zhongguoren 產生隨機數,可用uuid,儲存起來,一般儲存在threadlocal中,以便解鎖用 呼叫redis 的setnx命令將隨機數當作value存入,key為taskid,同時設定過期時間。實際專案中過期時間的多少主要是取決任務估算的執行時間,一般...
redis分布式鎖實現方案和原理解析
分布式鎖的在分布式集群環境中有著至關重要的作用,為了保證高併發場景下資料的一致性,確保業務能夠安全的執行,為了防止分布式系統中的多個程序之間相互干擾,我們需要一種分布式協調技術來對這些程序進行排程。而這個分布式協調技術的核心就是來實現這個分布式鎖。首先我們看一段很普通的 autowired stri...