首页 > 解决方案 > 如果集合中有那么多(计数)元素,如何使用带有计数的 spop 命令

问题描述

假设我想从集合中弹出 3 个元素,我如何确保只有在集合中存在 3 个元素时才弹出,否则返回任何错误或其他消息

如何使用带有“count”参数的“spop”命令。

标签: redis

解决方案


你想要的是调用SCARD myKey来测试成员的数量,并根据结果调用SPOP

SPOPwithCOUNT将返回给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,以提高网络性能。


推荐阅读