Redis 之 簡單分佈式鎖

爲什麼需要鎖?

鎖限制獨立的進程同時佔用同一資源, 資源可以是數據庫記錄, (行級鎖對應一條記錄, 表級鎖對應一類記錄.)。

我們通常是出於兩種目的, 希望進行這種限制:

  • 安全性(safety)
    通過鎖的限制, 對資源的併發操作被解除了, 不同的進程只能順序操作資源. 非常實際的例子是數據庫事務
  • 效率(effectiveness)
    鎖限制不同的進程擠佔計算資源.

Redis提供了一個命令,可以達到鎖的目的

set key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds:設置失效時長,單位秒
PX milliseconds:設置失效時長,單位毫秒
NX:key不存在時設置value,成功返回OK,失敗返回(nil)
XX:key存在時設置value,成功返回OK,失敗返回(nil)

案例:設置name=p7+,失效時長100s,不存在時設置
1.1.1.1:6379> set name p7+ ex 100 nx
OK
1.1.1.1:6379> get name
"p7+"
1.1.1.1:6379> ttl name
(integer) 94

說明
這個只是簡單的分佈式鎖,只會在比較極端的情況下出錯, 所以如果你處在一個僅僅需要保證數據大部分時候可靠, 萬一有問題也無所謂的情況下, 那麼放心的使用單節點redis或主從集羣來加鎖吧.
如果你對數據可靠性要求高,那麼請了解下其它方案實現分佈式鎖。比如基於ZK, etcd的“複雜”分佈式鎖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章