redis 分佈式鎖,一般使用開源的redisson
1.客戶端1的加鎖
第一個if 判斷 判斷鍵key是否存在
1判斷 key是否存在 exists key == 0 如果等於0 是 key 不存在
2.如果key 不存在,設置hset key argv2 1
3.設置key的過期時間 pexpire key argv1
第二個if判斷 判斷鎖是否是可重入
1.判斷key argv2是否存在,hexist key argv2 ==1 如果等於1 是可重入鎖
2. 如果是可重入鎖,對 key argv2 中的值進行+1 hincrby key argv2 1
3.設置key 的過期時間 pexpire key argv1
第三個判斷 如果key 已經存在,而且不是可重入鎖
1.設置pttl key 計算key的剩餘時間 while true 循環,不斷獲得鎖。
2.客戶端2獲得鎖
3.可重入鎖
4.watch dog的自動延期策略,默認是30s,每10s檢測一下
5.釋放鎖 1.每次對加鎖的次數減1,如果加鎖的次數==0,刪除對應的鍵
lua 腳本的優勢
1.不使用lua腳本的代碼,需要給redis 發送多次請求,而腳本只需要一次,減少網絡傳輸。
2.原子操作: redis 把整個lua腳本作爲一個原子執行,無需擔心併發,無需擔心事務
3.複用: lua腳本保存在redis中,可以被其他客戶端複用
參考:
2.https://www.cnblogs.com/williamjie/p/11250679.html----- redis 分佈式鎖
3.https://www.cnblogs.com/barrywxx/p/8563284.html---- redis 保證lua 腳本的原子性