redis - 如果集合中有那么多(计数)元素,如何使用带有计数的 spop 命令
问题描述
假设我想从集合中弹出 3 个元素,我如何确保只有在集合中存在 3 个元素时才弹出,否则返回任何错误或其他消息
如何使用带有“count”参数的“spop”命令。
解决方案
你想要的是调用SCARD myKey
来测试成员的数量,并根据结果调用SPOP
。
SPOP
withCOUNT
将返回给COUNT
成员,这意味着如果您的集合只有一两个,它们将被 SPOPed 并返回。
您可能希望通过一个原子操作来完成此操作。所以你必须使用Lua Scrips:
EVAL "if redis.call('SCARD', KEYS[1]) >= tonumber(ARGV[1]) then return redis.call('SPOP', KEYS[1], ARGV[1]) else return redis.error_reply(KEYS[1]..' does NOT have at least '..ARGV[1]..' members') end" 1 myKey myNumber
让我们看一下脚本:
if redis.call('SCARD', KEYS[1]) >= tonumber(ARGV[1]) then
return redis.call('SPOP', KEYS[1], ARGV[1])
else
return redis.error_reply(KEYS[1]..' does NOT have at least '..ARGV[1]..' members')
end
KEYS[1]
指的是 key 参数,即您感兴趣的集合。通过参数传递 key 很重要,以便您的脚本在 Redis 集群中得到支持。
ARGV[1]
是传递所需成员数量的附加参数,在您的问题中,它是 3。
该脚本在 Redis 的服务器端以原子方式运行,并且只编译一次,因为 Redis 在内部缓存它。
您可以使用SCRIPT LOAD
加载脚本,然后将其与 一起使用EVALSHA
,以提高网络性能。
推荐阅读
- python - 使用 Python 发送的电子邮件 - 多种方案 - 在 Outlook 的预览中使 ms word 和 adobe reader 崩溃
- php - Bootstrap-weekpicker 插件在表单中发布日期格式
- css - 在 Shopify 的集合页面上添加条件类
- python - 为什么 for 循环不重置 range() 函数?
- python - 如何修复 TypeError:'int' 对象不可迭代?
- swift - @Published in an ObservableObject vs @State on a View 导致 SwiftUI 中不可预测的更新行为
- database - SyntaxError:尝试将 Mongo Atlas 集合导出到本地计算机时缺少分号
- wpf - 为什么我在 powershell 中添加节点时不断获取属性列表?
- amazon-web-services - 如何防止搜索引擎爬虫为 AWS 上的域编制索引?
- reactjs - React+Webpack+Babel:模块解析失败:意外的令牌“<”