Redis的BITSET和WATCH

问题描述 投票:0回答:1

我使用Redis的创建从一系列声称未使用的整数算法。我的解决方案是基于我得到了this SO问题的答案。

该解决方案使用BITPOSBITSET,并避免竞争条件下,我也用WATCH / MULTI / EXEC。为了测试并发方面我创建的同时试图找到一个免费电话号码并行10次,调查EXEC命令的可能结果bash脚本。

我发现的是,EXEC从未返回null,即使在观看键被另一客户端修改。我加了延迟,从而有足够的时间去招惹使EXEC失败时,应该触发钟表机械并发修改,但事实并非如此。

所以基本上我有这段代码:

while (true) {
  WATCH mykey
  number = BITPOS mykey, 0
  if (number > maxNumber) THROW ERROR

  (deliberate delay)

  MULTI
  SETBIT mykey, number, 1
  if EXEC != null return number
}

也是一个循环调用SETBIT mykey, N, 1N = 1..10,在10个不同的进程。

我发现的是,EXEC从未返回null,即使键被另一个过程中的时间观看期间绝对修改。

问题:

  1. WATCH根本不支持基于BIT Redis命令?
  2. 如果是支持的,为什么不是在这种情况下触发?我在测试/发人深省的错误呢?据我了解,WATCH应该如果密钥已经被其他客户端/连接过程中的时间观看期间被修改,并调用这个来自10个不同的Linux进程,每个进程创建自己的连接EXEC失败,似乎符合这一要求?
  3. 在这种特殊情况下,确实WATCHMULTI实际上提供什么? BITSET返回该位的前值,所以不宜原子由下列伪代码算法简单地保证:
    while (true) {
      number = BITPOS mykey, 0
      if (number > maxNumber) THROW ERROR

      wasUsed = SETBIT mykey, number, 1

      if (!wasUsed) {
        return number
      }
    }
concurrency redis watch bitset
1个回答
1
投票
  1. 有没有文件表明WATCH不支持位设置命令。
  2. 你的代码看起来我的权利,所以很难说为什么它不工作。为了进一步研究它,你就必须提供一个MCVE而不是伪代码。然而...
  3. 你说得对,你不需要这里交易,该算法应保证原子。
© www.soinside.com 2019 - 2024. All rights reserved.