咱們都知道用keys *進行查詢key的時候會進行堵塞,致使redis總體不可用,而使用scan命令則不會.redis
RedisServiceImpl中scan的內容爲ide
@Override public ScanResult scan(String cursor, ScanParams params) { return execute(new RedisFunction<ScanResult, Jedis>() { @Override public ScanResult callback(Jedis jedis) { return jedis.scan(cursor,params); } }); }
而後定義一個工具類工具
public class RedisUntil { public static List<String> getScan(RedisService redisService,String key) { List<String> list = new ArrayList<>(); ScanParams params = new ScanParams(); params.match(key); params.count(100); String cursor = "0"; while (true) { ScanResult scanResult = redisService.scan(cursor,params); List<String> elements = scanResult.getResult(); if (elements != null && elements.size() > 0) { list.addAll(elements); } cursor = scanResult.getStringCursor(); if ("0".equals(cursor)) { break; } } return list; } }
使用該工具類進行批量刪除,假設咱們要刪除的是以"userpage:"爲前綴element
List<String> keyList = RedisUntil.getScan(redisService,"userpage:*"); for (String key:keyList) { redisService.del(key); }
這樣在生產環境中就不會堵塞redis.get