Redis命令:scan實現模糊查詢
轉;
Redis命令:scan實現模糊查詢
2017年12月31日 16:54:33 琦彥 閱讀數:22893 個人分類: Redis 所屬專欄: Redis:不只是數據庫 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/fly910905/article/details/789423571.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用法:
- 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
Redis命令:scan實現模糊查詢