Redis命令:scan實現模糊查詢


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

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*
SCAN命令: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)組成。

參考來源: http://redisdoc.com/key/scan.html#scan


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM