Skip to content

RedLock

可讀性低,需要整理

Brief

Lock

SET lockname my_random_number NX PX 30000
  • NX: create if not exist, 避免重複。
  • PX: TTL, 避免 Lock 持有者意外消失但沒有解鎖。

Unlock

if GET(lockname) == my_random_number then
	# ok, I still have lock.
	DEL lockname
else
	# lock may be expired before I try to unlock it.
end

這操作乍看之下可能需要 atomic ,因為 GET(lockname) == my_random_number 保證了只有持有者可以滿足這個條件,但考慮以下情境:

  1. Process1 going to unlock: 通過 GET(lockname) == my_random_number
  2. Lock expired!!
  3. Process2 lock
  4. Process1: DEL lockname ⚠️: unlock Process2's Lock!

這段確實是需要 atomic 。

Cluster

在 Redis Cluster 的情況下, RedLock 使用情況會變得更為嚴峻:由於 Lock 本身有 TTL,再加上存取 Cluster 的共識值(例如超過半數都是某個數值)會需要更多時間,所以實際上有效持有 Lock 的時間是 TTL - 取得共識值消耗的時間

🤔 疑問

很好奇在那些情況下會選用這個方案。

Reference

Changelog

Just observe 👀