【问题标题】:redis distributed lock simple systemredis分布式锁简单系统
【发布时间】:2021-06-01 07:58:00
【问题描述】:

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

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

会喜欢你的想法

【问题讨论】:

    标签: redis lua locking


    【解决方案1】:
    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-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      相关资源
      最近更新 更多