Redis高階操作:scan代替keys
阿新 • • 發佈:2021-01-16
首先我們上程式碼
/** * 根據match 查詢redis中中的所有key * @param match input the argument "ONLINE_*" * @param limit 每次查詢個數,不要太大 */ public Set getKeySize(String match,int limit) { HashSet<String> keySet = Sets.newHashSet(); Jedis jedis = jedisPool.getResource(); ScanParams scanParams = new ScanParams().match(match).count(limit); //指定規則 boolean hasNext = true; String cursor = "0"; //第一次查詢的遊標 while (hasNext) { ScanResult<String> scanResult = jedis.scan(cursor,scanParams); List<String> keyList = scanResult.getResult();//返回當前查詢的key keySet.addAll(keyList); cursor = scanResult.getStringCursor(); if ("0".equals(cursor)) { hasNext = false; } } return keySet; }
解釋:
上面的程式碼我們使用了scan命令,那麼為什麼不用 keys命令呢?其實是keys是阻塞的當key太多時,就會對redis造成很大壓力
redis scan命令解釋
命令: scan cursor [MATCH pattern] [COUNT count]
該命令其實是一個遊標查詢,跟elasticsearch的滾動查詢是一樣的
MATCH : 模糊匹配 ,讓命令只返回和給定模式相匹配的元素 ,如:ORDER_*
COUNT : 每次的查詢條數,預設值為 10 ,(每次返回的數量其實不完全等於COUNT 值)
注意: 遊標返回的資料可能會重複,需要處理重複key