redis分布式锁简单系统
redis distributed lock simple system
所以我想要一个锁定系统,如果锁定 exists/acquired 其他进程将等待(设置超时)直到锁定空闲并且其中一个等待进程将能够获取锁定。
现在在 Redis 中,这个命令几乎可以满足我的要求:
SET lock_key "locked" EX 10 NX
但如果密钥存在,我会得到 nil
。
我怎样才能让它等待(使用 lua?)直到密钥不再存在?
更新:
正在处理 LUA 解决方案(伪代码):
x=llen free
y=llen lock
if x+y =0 ; lpush free a
brpoplpush free lock 30
expire lock 600
我正在检查列表是否为空,所以我向 free
添加了一个值 - 这是锁定的一种初始化。
brpoplpush
是实际锁定,如果锁定则等待。
expire
用于 10 分钟内未释放锁(无论出于何种原因)。
会喜欢你的想法
echo -e "
eval \"if redis.call('llen', KEYS[1]) + redis.call('llen', ARGV[1]) == 0 then
redis.call('lpush', KEYS[1], 'a') end\" 1 free lock
brpoplpush free lock 30
expire lock 600" | redis-cli -h $REDIS
它是 pipeline
和 eval
的混合。
所以我想要一个锁定系统,如果锁定 exists/acquired 其他进程将等待(设置超时)直到锁定空闲并且其中一个等待进程将能够获取锁定。
现在在 Redis 中,这个命令几乎可以满足我的要求:
SET lock_key "locked" EX 10 NX
但如果密钥存在,我会得到 nil
。
我怎样才能让它等待(使用 lua?)直到密钥不再存在?
更新:
正在处理 LUA 解决方案(伪代码):
x=llen free
y=llen lock
if x+y =0 ; lpush free a
brpoplpush free lock 30
expire lock 600
我正在检查列表是否为空,所以我向 free
添加了一个值 - 这是锁定的一种初始化。
brpoplpush
是实际锁定,如果锁定则等待。
expire
用于 10 分钟内未释放锁(无论出于何种原因)。
会喜欢你的想法
echo -e "
eval \"if redis.call('llen', KEYS[1]) + redis.call('llen', ARGV[1]) == 0 then
redis.call('lpush', KEYS[1], 'a') end\" 1 free lock
brpoplpush free lock 30
expire lock 600" | redis-cli -h $REDIS
它是 pipeline
和 eval
的混合。