Redis實現分散式鎖

Real_man發表於2019-02-16

分散式鎖要解決的幾個問題:

  • 互斥性,同一時刻只能有一臺伺服器能訪問資源
  • 安全性,鎖只能被持有該鎖的客戶端刪除或者釋放
  • 容錯,在伺服器當機的時候,鎖仍能得到釋放或者其他伺服器可以進行加鎖
  • 避免死鎖

方案1

  1. 首先使用setnx命令,即當沒有key存在的時候,才會建立value。

    • 當執行成功的時候會返回1

    • 當執行失敗的時候會返回0

  2. 使用expire命令,指定key的過期時間

setnx key value
expire key second
複製程式碼

image.png

問題:

因為操作不是原子性的,如果在進行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

image.png

問題:

當同一時刻有大量的key過期的時候,刪除key是需要時間的,可能導致redis出現暫時的卡頓現象,要如何解決?

答:在設定key過期時間的時候加上一個隨機值

參考

相關文章