當redis集合有大量的鍵值對的時候,若是使用smembers來獲取就如同keys *在redis有大量鍵的時候同樣,會產生性能問題,發生阻塞。因此建議使用sscan來遍歷集合,具體jedis代碼以下redis
public static Set<String> getSscan(Jedis redisService,String key) { Set<String> set = new HashSet<>(); ScanParams params = new ScanParams(); params.match(key); params.count(100); String cursor = "0"; while (true) { ScanResult scanResult = redisService.sscan(key,cursor,params); List<String> elements = scanResult.getResult(); if (elements != null && elements.size() > 0) { set.addAll(elements); } cursor = scanResult.getStringCursor(); if ("0".equals(cursor)) { break; } } return set; }
sscan的缺點就是沒法徹底實時性的獲取全部的集合元素,若是在代碼運行期間有新的元素加入集合可能會獲取不到,不過對於實時性要求不高的狀況下是徹底能夠的,不會發生性能堵塞問題。性能