Jedis scan及其count的值

  之前在做统计相关功能的时候,使用到了redis的keys,但是,跑了一段时间后,被运维的慢查询给抓出来了,说这个太慢了,需要10ms(平常的命令只需要2-3ms),并且keys会造成阻塞,影响其他进程。。。

   好吧,那就改成scan。本来是是想拿百度现成的来用,但是,居然没有搜索到!amazing!好吧,那就只能扒官方了。

1.官网

首先找到Spring Data Redis官网,然后进入API链接,Jedis scan及其count的值_第1张图片

2.Scan

然后,Jedis scan及其count的值_第2张图片

 

3.ScanOptions---->Scan方法的参数   

这里可以看到,scan方法,需要一个scanOptions参数,点进scanOptions类,发现scanOptons有个静态内部类--scanOptionsBuilder

Jedis scan及其count的值_第3张图片

4.scanOptionsBuilder--->构造ScanOptions

scanOptionsBuilder类,又有count、match、build三个方法。看描述,match是充当匹配的作用,count是返回匹配到的数目,build是scanOptionsBuilder转换为scanOptions对象

Jedis scan及其count的值_第4张图片

 

看了这么多,其实转换为代码,就一行而已

 

 ScanOptions options = ScanOptions.scanOptions().match(workQKey).count(Integer.MAX_VALUE).build();

        Cursor c = redisConnection.scan(options);
        while (c.hasNext()) {
            logger.info(new String((byte[]) c.next()));
        }

 

 

5.scanOptionsBuilder的count参数

 

 

测试了一番,和keys的效果是一致的。but,count的参数为什么是Integer.MAX_VALUE呢?我尝试了下,把Integer.MAX_VALUE改成了100(需要统计的key有122个),然后,就飙红了

Jedis scan及其count的值_第5张图片

但是,你把count从100改成大于等于122,那就正常运行。按这规律,是count的参数必须不小于实际数量?我也在stackoverflow看到一篇帖子,说的貌似也是要这样解决。。

你可能感兴趣的:(中间件/缓存)