备注:本文修订于2021年9月17日

当set类型的数据量比较小时可以使用smembers命令取出全部key,但是当数据量比较大情况下,使用这个命令会阻塞住Redis线程,众所周知,Redis是单线程运行模式。Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。在执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。如果smembers命令的执行事件过长,则会影响后续的命令。此时,可以通过sscan命令分批次查看数据。

1、Redis Sscan 命令语法

sscan key cursor [MATCH pattern] [COUNT count]

cursor参数。sscan命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为sscan 命令的游标参数,以此来延续之前的迭代过程。需要注意的是:当sscan命令的游标参数被设置为 0 时,服务器将开始一次新的迭代,而当服务器向用户返回值为 0 的游标时,表示迭代已结束

COUNT选项。虽然增量式迭代命令不保证每次迭代所返回的元素数量,但我们可以使用COUNT选项,对命令的行为进行一定程度上的调整。COUNT选项的作用就是让用户告知Redis,在每次迭代中应该从数据集里返回多少元素。count 参数的默认值为 10

MATCH选项。MATCH选项可以让命令只返回与给定模式相匹配的元素。

2、Redis Sscan 命令返回值

数组列表

3、Redis Sscan 命令例子

127.0.0.1:6379> SADD fruit "apple" "pear" "banana" "peach" "grape" "orange"
(integer) 6
127.0.0.1:6379> sscan fruit 0 match p* count 3
1) "2"
2) 1) "pear"
   2) "peach"

4、Redis Sscan 命令的Java应用举例

List<String> list = new ArrayList<>();
String cursor = "0";
while(true)
{
    ScanResult<String> users = jedisCluster.sscan("users", cursor);
    List<String> result = users.getResult();
    list.addAll(result);
    cursor = users.getStringCursor();
    if(cursor == "0")
    {
        break;
    }
    
}

sscan命令有一个游标cursor参数,通过它来确定读取的数据位置。sscan命令返回结果是一个ScanResult对象,通过getResult方法得到数据,通过getStringCursor方法得到下一次查询的游标位置,在下一次查询时传入即可。

5、扩展阅读

redis scan命令的基本用法

标签: none

添加新评论