当前位置: 首页 > 面试题库 >

Redis BITSET和WATCH

薛飞星
2023-03-14
问题内容

我正在使用Redis创建一种算法来声明某个范围内未使用的整数。

此解决方案使用BITPOSBITSET,并且为了避免出现竞争情况,我也使用WATCH/ MULTI/
EXEC。为了测试并发方面,我创建了一个bash脚本,该脚本同时尝试并行查找10个空闲数字,以调查EXEC命令的可能结果。

我发现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. 如果得到支持,为什么在这种情况下不触发它?我是否在错误地测试/挑衅?据我了解,如果密钥已在监视的时间内 被另一个客户端/连接 修改,并且从10个不同的Linux进程(每个进程都创建自己的连接)中调用此密钥似乎符合该要求,WATCH应该EXEC失败吗? __
  3. 在这种特殊情况下,也WATCHMULTI实际提供的东西吗?BITSET返回该位的先前值,因此不应仅通过以下伪代码算法来保证原子性:
    while (true) {
      number = BITPOS mykey, 0
      if (number > maxNumber) THROW ERROR
    
      wasUsed = SETBIT mykey, number, 1
    
      if (!wasUsed) {
        return number
      }
    }
    

问题答案:
  1. 没有文档表明WATCH不支持位设置命令。

  2. 您的代码对我来说看起来很正确,因此很难说出为什么它不起作用。为了进一步研究它,您必须提供MCVE而不是伪代码。然而…

  3. 是的,这里不需要事务,此算法应保证原子性。



 类似资料:
  • 问题内容: 关于它们有很多传说。我想知道真相。以下两个示例之间有什么区别? 问题答案: 不确定从何处获得传说,但: 提交按钮 与: IE6将在标记之间提交此按钮的所有文本,其他浏览器将仅提交值。使用可使您在按钮的设计上享有更大的布局自由度。从各种意图和目的看,它乍一看似乎很棒,但是各种浏览器怪癖使它有时很难使用。 在您的示例中,IE6将发送到服务器,而其他大多数浏览器将不发送任何内容。要使其跨浏览

  • 什么区别以及如何正确重写代码?

  • 我试图理解为什么下面两个代码块会产生不同的结果。 代码块1按预期工作,并返回从数据库中查找的提供程序的数组。另一方面,代码块2返回函数数组。在理解promissione.all()和async/await时,我觉得缺少了一些简单的东西。 代码块的差异如下: > 块1:创建许诺函数数组,然后使用map运算符将其包装在异步函数中。 块2:许诺函数的数组被创建为异步函数。因此,不调用map运算符。 如果

  • 问题内容: 我才刚刚开始研究SQL。 我有一个SQL Server 2008r2数据库,它将返回两个字段DocDate和InvValue。我需要将InvValues汇总为今天的MTD和YTD,所以看起来像 我已经做了大量的Google搜寻,并且可以使用SUM&DATEPART进行一项或多项,但是我坚持尝试两者兼而有之。 有人可以给我一些伪代码,以帮助我进一步谷歌。 谢谢@戈登·利诺夫(Gordon

  • 这个示例代码来自一本Java书籍,从墙上的99瓶啤酒到没有啤酒打印出这首歌。问题是,当墙上是1瓶啤酒时,它仍然写着瓶子。我试图通过在末尾添加部分来解决这个问题。但是,它仍然显示1瓶啤酒在墙上,我瓶啤酒在墙上。 我不知道该改变什么来解决这个问题。是否创建另一个while部分? 如果你能给他们一个提示,这样我就可以自己解决它,那也很酷!因为我知道我的实际歌曲输出是在第一个if部分,但我不知道我应该在哪

  • 原文地址:https://cesiumjs.org/tutorials/cesium-and-webpack/ Cesium 和 Webpack Webpack是非常强大非常流行的JavaScript 模块打包工具。它可以让开发人员以一种简单直观的 require 方式去加载各种页面需要的文件,极大的方便了开源人员对代码和资源文件进行结构化设计。当编译的时候,它会跟踪代码依赖性,把所有的模型打包到