Redis命令:scan實現模糊查詢

1.前言

從Redis v2.8開始,SCAN命令已經可用,它允許使用遊標從keyspace中檢索鍵。 對比KEYS命令,雖然SCAN無法一次性返回所有匹配結果,但是卻規避了阻塞系統這個高風險,從而也讓一些操作可以放在主節點上執行。

使用場景:想把Redis的內容全量掃描導入到MySQL。

2.SCAN相關命令

SCAN相關命令還包括SSCAN 命令、HSCAN 命令和 ZSCAN 命令,分別用於集合、哈希鍵及有續集等 SCAN 命令用於迭代當前數據庫中的數據庫鍵。 SSCAN 命令用於迭代集合鍵中的元素。 HSCAN 命令用於迭代哈希鍵中的鍵值對。 ZSCAN 命令用於迭代有序集合中的元素(包括元素成員和元素分值)。 因爲 SCAN 、 SSCAN 、 HSCAN 和 ZSCAN 四個命令的工作方式都非常相似, 要記住: SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一個參數總是一個數據庫鍵。

而 SCAN 命令則不需要在第一個參數提供任何數據庫鍵 —— 因爲它迭代的是當前數據庫中的所有數據庫鍵。

3.基本用法:

命令格式:SCAN cursor [MATCH pattern] [COUNT count] 命令解釋:scan 遊標 MATCH <返回和給定模式相匹配的元素> count 每次迭代所返回的元素數量 SCAN命令是增量的循環,每次調用只會返回一小部分的元素。所以不會有KEYS命令的坑(key的數量比較多,一次KEYS查詢會block其他操作)。 SCAN命令返回的是一個遊標,從0開始遍歷,到0結束遍歷。 通過scan中的MATCH <pattern> 參數,可以讓命令只返回和給定模式相匹配的元素,實現模糊查詢的效果 示例:

scan 0 match DL* count 5 
sscan myset 0 match f*
Jedis用法:
 @Test
    public void testScan() {
        // 創建一個jedis的對象。
        Jedis jedis = new Jedis("192.168.112.65", 6379);
        jedis.auth("zhifu123");
        // 調用jedis對象的方法,方法名稱和redis的命令一致。
        ScanParams scanParams = new ScanParams();
        scanParams.match("DL*");
        scanParams.count(5);
        jedis.select(1);
        // scan(curso,params) cursor 表示開始遍歷的遊標   params 是ScanParams 對象,此對象可以設置 每次返回的數量,以及遍歷時的正則表達式
        // 需要注意的是,對元素的模式匹配工作是在命令從數據集中取出元素之後,向客戶端返回元素之前的這段時間內進行的,
        //  所以如果被迭代的數據集中只有少量元素和模式相匹配,那麼迭代命令或許會在多次執行中都不返回任何元素。  
        ScanResult<String> scan = jedis.scan("0", scanParams);
        System.out.println("scan:返回用於下次遍歷的遊標"+scan.getStringCursor());
        System.out.println("scan:返回結果"+scan.getResult());
        // 關閉jedis。
        jedis.close();
    }

4.返回值:

SCAN 命令、 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都返回一個包含兩個元素的 multi-bulk 回覆:

回覆的第一個元素是字符串表示的無符號 64 位整數(遊標), SCAN 命令每次被調用之後, 都會向用戶返回一個新的遊標, 用戶在下次迭代時需要使用這個新遊標作爲 SCAN 命令的遊標參數, 以此來延續之前的迭代過程。 當 SCAN 命令的遊標參數被設置爲 0 時, 服務器將開始一次新的迭代, 而當服務器向用戶返回值爲 0 的遊標時, 表示迭代已結束。

回覆的第二個元素是另一個 multi-bulk 回覆, 這個 multi-bulk 回覆包含了本次被迭代的元素。 注意:SCAN命令不能保證每次返回的值都是有序的,另外同一個key有可能返回多次,不做區分,需要應用程序去處理。 SCAN 命令返回的每個元素都是一個數據庫鍵。 SSCAN 命令返回的每個元素都是一個集合成員。 HSCAN 命令返回的每個元素都是一個鍵值對,一個鍵值對由一個鍵和一個值組成。 ZSCAN 命令返回的每個元素都是一個有序集合元素,一個有序集合元素由一個成員(member)和一個分值(score)組成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章