分散式鎖要解決的幾個問題:
- 互斥性,同一時刻只能有一臺伺服器能訪問資源
- 安全性,鎖只能被持有該鎖的客戶端刪除或者釋放
- 容錯,在伺服器當機的時候,鎖仍能得到釋放或者其他伺服器可以進行加鎖
- 避免死鎖
方案1
-
首先使用setnx命令,即當沒有key存在的時候,才會建立value。
-
當執行成功的時候會返回1
-
當執行失敗的時候會返回0
-
-
使用expire命令,指定key的過期時間
setnx key value
expire key second
複製程式碼
問題:
因為操作不是原子性的,如果在進行setnx的時候,剛好伺服器當機,沒有來得及進行expire,那麼該key將一直無法釋放。
方案2
直接使用redis的原子命令:
set key value [EX seconds] [PX milliseconds] [NX|XX]
複製程式碼
- EX: key在多少秒之後過期
- PX:key在多少毫秒之後過期
- NX: 當key不存在的時候,才建立key,效果等同於setnx
- XX:當key存在的時候,覆蓋key
問題:
當同一時刻有大量的key過期的時候,刪除key是需要時間的,可能導致redis出現暫時的卡頓現象,要如何解決?
答:在設定key過期時間的時候加上一個隨機值