1.要模糊查詢redis中的key
方法一:使用scan命令(推薦)
scan cursor [MATCH pattern] [COUNT count]
- cursor:表示游標,從“0”開始,此命令執行完后會返回一個新的cursor值。如果cursor!="0",則表示還有key未返回,需要再調用scan,並使用此新的cursor值,來獲取下一批key;如果cursor=="0",則表示遍歷結束。
- pattern:表示模糊匹配的樣式
- count:表示一批最多返回多少條記錄,默認為10
注: keys pattern里面有3個通配符 分別是 *,?,[]
*:通配多個任意字符
?:通配單個字符
[]:通配數組內的某個字符
java實現:
do {
ScanParams scanParams = new ScanParams();
//*表示匹配任意數量的任意字符
scanParams.match("xxxx*");
scanParams.count(10);
ScanResult<String> sr = jedis.scan(cursor, scanParams);
List<String> resultList = sr.getResult();
for (String result : resultList) {
System.out.println("key: " + result);
//對key的操作,或者先放到一個集合里面,然后再進行后續操作
}
cursor = sr.getStringCursor();
System.out.println("cursor: " + cursor);
} while (!cursor.equals("0"));
方法二:keys 指令 (只適合在測試環境中使用,不適合在生產環境中使用,原因是redis是單線程運行的,當redis中的數據量很大時,由於此操作會遍歷所有數據,並將結果一次性全部返回,執行時間會比較長,從而導致后續操作等待,直接影響系統的正常運行)
@Autowired private RedisTemplate redisTemplate; public void getKey() { long start = System.currentTimeMillis(); redisTemplate.keys("cart*"); long end = System.currentTimeMillis(); System.out.println(end - start); RedisConnection connection = RedisConnectionUtils.getConnection(redisTemplate.getConnectionFactory()); Cursor<byte[]> result = connection.scan(new ScanOptions.ScanOptionsBuilder().count(10).match("cart*").build()); long start1 = System.currentTimeMillis(); //cursor有id和position這兩個屬性,id則對應 scan cursor 的cursor的值,poisition則是當前遍歷到第幾個 while (result.hasNext()) {//這里可以改用for循環來獲取指定數量的key String key=new String(result.next()); //對key的操作,或者先放到一個集合里面,然后再進行后續操作 } long end1 = System.currentTimeMillis(); System.out.println(end1 - start1); }
結束
