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

尽管存在密钥,Redis spop返回null-NodeJS

顾斌
2023-03-14
问题内容

我有一个问题,尽管数据库中存在一个键/条目,但spopRedis命令仍会返回null

我从未在本地计算机上运行的Redis服务器上遇到此问题。令人讨厌的是,没有错误或任何东西。

我使用Redis Desktop Manager来检查Heroku Redis数据库中的内容。

这是获取数据库中值的NodeJS代码:

redis.spop('id', function (err, result) {}

我可能会做的一件异常事如下:我同时有多达6个处理popping数据库中的值。

知道什么会导致这种奇怪的行为吗?

  • Redis本地:3.0.4
  • Redis远程:Heroku 3.0.3
  • NodeJS模块:ioredis

问题答案:

我的猜测是这样的事情正在发生:

  • 读者#1检查看是否有剩余的数据
  • Redis返回 “是的,我还有一件物品”
  • 读者#2检查看是否有剩余的数据
  • Redis返回 “是的,我还有一件物品”
  • 读者#1弹出此项目(清空集合
  • 读者#2尝试弹出该项目,并返回a,null因为该集合现在为空。

在检查设置大小和弹出值之间有一个竞争条件,这意味着在这两个操作之间有一个很小的时间窗口,另一个读取器也可以弹出一个值(这就是为什么当您只有一个时不会发生此问题的原因读者)。

Redis有一些 列表
命令(例如BRPOP),它们会等到要弹出的实际项目时才出现,但是 set
没有类似的命令。但是,Redis文档包含一些示例代码,说明您如何能够实现类似的代码。

另外,您可以实现某种形式的锁定,尽管这可能会影响性能。

最后,如果您的读者从一个空的集合中弹出,也许甚至不是什么大问题,在这种情况下,他们只会忽略,null然后稍后再检查。



 类似资料:
  • 我正在尝试使用Firebase云消息传递向IOS设备发送通知-Firebase控制台中的每个IOS项目都有一个有效的APNs P8 Auth Key,该密钥是为此目的从Apple开发者帐户新生成的。 我正在使用这种方法: 这导致FCM出现以下错误: 如果我从消息中删除“通知”块,FCM会成功响应,但设备上没有收到任何消息。 我可以使用上面的示例消息向Android设备发送和接收通知。 FCM文档表

  • 当我试图在工作区中使用文本文件创建BufferedReader时,“new BufferedReader语句”中的FileReader抛出一个filenotfoundexception。然而.exists()和.canRead()对于文件都返回true 这是代码 和输出 以及当我取消注释bufferedreader行时引发的异常 我发现了一个类似于这个的封闭线程,但在其中找不到任何明确的答案。

  • . 注意IAddItMethod不是指定@Cacheable的那个。我们可以有其他实现(如MethodImplThree)而不使用@Cacheable注释。 我们有一个简单的beans.xml,其中包含: 有什么我忘了说明的吗?配置?注释? 提前道谢!

  • 问题内容: 我正在尝试将具有叠加层的地图快照保存在caches目录中,并在其存在时进行检索。但是,尽管正在创建文件,但当我尝试检索它时,UIImage(contentsOfFile :)返回nil。我已经打印了写和读的文件路径,它们是相同的,并通过下载容器并检查目录来验证文件是否存在,并且文件确实存在。 知道这里的问题是什么吗? 问题答案: 那里的问题是您使用URL属性absoluteString

  • 我花了几个小时来查找为什么我的代码没有从这个结构X:/中检索到文件“firstname”的原因 当我在debug中时,我可以看到Firebase检索与“firstname”相同级别的所有其他字段,但最后一个字段始终为null,即使它中有有效数据。 这是我创建FireStoreRecyclerOptions的行: 这是我的QueryFireStore: 而X类是一个POJO,包含以下数据结构:

  • 我有一个具有多个字段的静态编程语言枚举。其中一个字段()是另一个枚举的值。在运行时,尽管已设置,但此val为空。 我以前从未见过这样的情况,其他字段工作正常,即使是引用当前项目的字段!我已经包含了完整的枚举定义,因为我不确定什么是相关的。 枚举和一个值,其中意外为空,而不是。 电路板枚举和相关值: 这是意外为空的截图: 附加说明: 我尝试更改树9中的其他值,它们都会更新,因此包含的定义肯定就是所使