Jedis scan及其count的值

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

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

1.官网

首先找到Spring Data Redis官网,然后进入API链接,

2.Scan

然后,


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

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


4.scanOptionsBuilder--->构造ScanOptions

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



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

 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个),然后,就飙红了


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

posted @ 2018-02-11 21:24  Bug开发攻城狮  阅读(2550)  评论(0编辑  收藏  举报