1. 程式人生 > 資料庫 >redis模糊查詢鍵值對

redis模糊查詢鍵值對

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);
}

 

結束