尽管存在密钥,Redis spop返回null-NodeJS
我有一个问题,尽管数据库中存在一个键/条目,但spop
Redis命令仍会返回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
然后稍后再检查。
以上是 尽管存在密钥,Redis spop返回null-NodeJS 的全部内容, 来源链接: utcz.com/qa/415033.html