redis分布式锁简单系统

时间:2021-03-02 18:26:32

标签: redis lua locking

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

>

现在在 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 分钟内未释放锁(无论出于何种原因)。

会喜欢你的想法

1 个答案:

答案 0 :(得分:0)

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 的混合体。