1.redis 命令 Sscan/Sinterstore/Sunionstore/Spop
迭代集合中的元素
迭代集合中的元素
语法
SSCAN key cursor [MATCH pattern] [COUNT count] #返回指定个数count 个的满足 pattern 模式的成员。
可用版本:
2.8.0
时间复杂度:
每次调用 O(1)。O(N) 用于完整的迭代,包括足够的命令调用以使光标返回 0。N 是集合内的元素数。
ACL 类别:
@read, @set, @slow
请参阅SCAN文档SSCAN
cursor:游标,表示当前迭代的位置。初始值为0,表示从头开始扫描。每次调用SSCAN后,Redis会返回一个新的游标值,用于下一次迭代。当游标返回0时,表示迭代完成。
pattern:匹配的模式,支持通配符,例如user:*匹配以user:开头的所有键。如果不指定MATCH,则返回所有键。
count:指定从数据集中返回多少元素,默认值为10。这只是一个提示值,实际返回的键数量可能会少于或多于该值。
返回值是一个数组列表,包含两个元素:新的游标值和匹配的键列表。如果返回0,表示迭代完成
使用场景和示例:
迭代集合中的键:可以用于遍历集合中的所有键,例如遍历用户会话键进行清理。
模糊查询与分页:结合MATCH参数实现模糊匹配,利用COUNT参数近似分页控制返回量。
注意事项:
重复键处理:迭代过程中若键被修改(新增/删除),可能导致重复或遗漏。需客户端去重处理。
弱一致性保证:迭代过程中若键被修改,可能影响结果的准确性。适用于不需要强一致性的场景
192.168.1.80:6400> sadd key1 "xsq1" "xsq2" "xsq3" "xsq4" "xsq5"
(integer) 5
192.168.1.80:6400> smembers key1
1) "xsq2"
2) "xsq4"
3) "xsq1"
4) "xsq3"
5) "xsq5"
192.168.1.80:6400> sscan key1 0 match xsq* count 3
1) "1"
2) 1) "xsq2"
2) "xsq4"
3) "xsq1"
192.168.1.80:6400> sscan key1 0 match xsq* count 5
1) "0"
2) 1) "xsq2"
2) "xsq4"
3) "xsq1"
4) "xsq3"
5) "xsq5"
192.168.1.80:6400> sscan key1 0 match xsq* count 10
1) "0"
2) 1) "xsq2"
2) "xsq4"
3) "xsq1"
4) "xsq3"
5) "xsq5"
Sinterstore 返回交集并存储在集合中
返回给定所有集合的交集并存储在 destination 中
语法
SINTERSTORE destination key [key ...]
可用版本:
1.0.0
时间复杂度:
O(N*M) 最坏情况,其中 N 是最小集合的基数,M 是集合的数量。
ACL 类别:
@write, @set, @slow
此命令等于SINTER,但不是返回结果集,而是存储在destination中。
如果destination已经存在,则将其覆盖。
#返回
整数回复:结果集中的元素数。
#例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTERSTORE key key1 key2 #将key1和key2的交集存储在key中。
(integer) 1
redis> SMEMBERS key
1) "c"
redis>
Sunionstore 并集持久化
所有给定集合的并集存储在 destination 集合中
语法
SUNIONSTORE destination key [key ...]
可用版本:
1.0.0
时间复杂度:
O(N) 其中 N 是所有给定集合中的元素总数。
ACL 类别:
@write, @set, @slow
此命令等于SUNION,但不是返回结果集,而是存储在destination中。
如果destination已经存在,则将其覆盖。
#返回
整数回复:结果集中的元素数。
#例子
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNIONSTORE key key1 key2 #将key1和key2的并集存储到key中。
(integer) 5
redis> SMEMBERS key
1) "c"
2) "b"
3) "a"
4) "e"
5) "d"
redis>
Spop 删除并返回。
移除并返回集合中的一个随机元素
语法
SPOP key [count]
可用版本:
1.0.0
时间复杂度:
没有计数参数 O(1),否则为 O(N),其中 N 是传递计数的值。
ACL 类别:
@write, @set, @fast
从位于key处的设置值存储中删除并返回一个或多个随机成员。
此操作类似于SRANDMEMBER,从集合中返回一个或多个随机元素但不删除它。
默认情况下,该命令会从集合中弹出一个成员。当提供可选count参数时,回复将由最多count成员组成,具体取决于集合的基数。
#返回
不带count参数调用时:
批量字符串回复:被移除的成员,或者nil何时key不存在。
当使用count参数调用时:
数组回复key:被移除的成员,或者当不存在时为空数组。
#例子
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SPOP myset #随机弹出一个元素
"two"
redis> SMEMBERS myset
1) "three"
2) "one"
redis> SADD myset "four"
(integer) 1
redis> SADD myset "five"
(integer) 1
redis> SPOP myset 3 #随机弹出三个元素。
1) "three"
2) "one"
3) "four"
redis> SMEMBERS myset
1) "five"
redis>
#返回元素的分布
请注意,当您需要保证返回元素的均匀分布时,此命令不适合。有关用于 的算法的更多信息SPOP,请查看 Knuth 采样和 Floyd 采样算法。
#历史
从 Redis 版本 3.2.0 开始:添加了count参数。
3168

被折叠的 条评论
为什么被折叠?



