之前在做統計相關功能的時候,使用到了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看到一篇帖子,說的貌似也是要這樣解決。。