1. 程式人生 > >Redis命令:scan實現模糊查詢

Redis命令:scan實現模糊查詢

time tro article -c target .html mat views data

轉;

Redis命令:scan實現模糊查詢

2017年12月31日 16:54:33 琦彥 閱讀數:22893 標簽: redis 數據庫 Redis命令 scan 模糊查詢 個人分類: Redis 所屬專欄: Redis:不只是數據庫 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/fly910905/article/details/78942357

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> 參數,可以讓命令只返回和給定模式相匹配的元素,實現模糊查詢的效果

  1. 示例:
  2. scan 0 match DL* count 5
  3. sscan myset 0 match f*

SCAN命令:Jedis用法:

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

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實現模糊查詢