redis 分布式锁简单系统

所以我想要一个锁定系统,如果锁已存在/被获取,其他进程将等待(设置超时),直到锁可用,并且等待中的一个进程能够获取锁。

现在在 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 分钟后的操作。

期待你的想法

点赞
用户719001
用户719001
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

这是一个 pipelineeval 的混合命令。

2021-03-03 14:13:12