爲什麼需要鎖?
鎖限制獨立的進程同時佔用同一資源, 資源可以是數據庫記錄, (行級鎖對應一條記錄, 表級鎖對應一類記錄.)。
我們通常是出於兩種目的, 希望進行這種限制:
- 安全性(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的“複雜”分佈式鎖。