本題考察的知識點有如下幾個:redis
咱們先來模擬海量數據,使用 Pipeline 添加 10w 條數據,Java 代碼實現以下:bash
import redis.clients.jedis.Jedis;import redis.clients.jedis.Pipeline;import utils.JedisUtils;public class ScanExample { public static void main(String[] args) { // 添加 10w 條數據 initData(); } public static void initData(){ Jedis jedis = JedisUtils.getJedis(); Pipeline pipe = jedis.pipelined(); for (int i = 1; i < 100001; i++) { pipe.set("user_token_" + i, "id" + i); } // 執行命令 pipe.sync(); System.out.println("數據插入完成"); }}
複製代碼
咱們來查詢用戶 id 爲 9999* 的數據,Scan 命令使用以下:服務器
127.0.0.1:6379> scan 0 match user_token_9999* count 100001) "127064"2) 1) "user_token_99997"127.0.0.1:6379> scan 127064 match user_token_9999* count 100001) "1740"2) 1) "user_token_9999"127.0.0.1:6379> scan 1740 match user_token_9999* count 100001) "21298"2) 1) "user_token_99996"127.0.0.1:6379> scan 21298 match user_token_9999* count 100001) "65382"2) (empty list or set)127.0.0.1:6379> scan 65382 match user_token_9999* count 100001) "78081"2) 1) "user_token_99998" 2) "user_token_99992"127.0.0.1:6379> scan 78081 match user_token_9999* count 100001) "3993"2) 1) "user_token_99994" 2) "user_token_99993"127.0.0.1:6379> scan 3993 match user_token_9999* count 100001) "13773"2) 1) "user_token_99995"127.0.0.1:6379> scan 13773 match user_token_9999* count 100001) "47923"2) (empty list or set)127.0.0.1:6379> scan 47923 match user_token_9999* count 100001) "59751"2) 1) "user_token_99990" 2) "user_token_99991" 3) "user_token_99999"127.0.0.1:6379> scan 59751 match user_token_9999* count 100001) "0"2) (empty list or set)
複製代碼
從以上的執行結果,咱們看出兩個問題:ide
相關語法:scan cursor [MATCH pattern] [COUNT count]
ui
其中:spa
本文咱們使用 Java 代碼來實現 Scan 的查詢功能,代碼以下:code
import redis.clients.jedis.Jedis;import redis.clients.jedis.Pipeline;import redis.clients.jedis.ScanParams;import redis.clients.jedis.ScanResult;import utils.JedisUtils;public class ScanExample { public static void main(String[] args) { Jedis jedis = JedisUtils.getJedis(); // 定義 match 和 count 參數 ScanParams params = new ScanParams(); params.count(10000); params.match("user_token_9999*"); // 遊標 String cursor = "0"; while (true) { ScanResult<String> res = jedis.scan(cursor, params); if (res.getCursor().equals("0")) { // 表示最後一條 break; } cursor = res.getCursor(); // 設置遊標 for (String item : res.getResult()) { // 打印查詢結果 System.out.println("查詢結果:" + item); } } }}
複製代碼
以上程序執行結果以下:orm
查詢結果:user_token_99997cdn
查詢結果:user_token_9999視頻
查詢結果:user_token_99996
查詢結果:user_token_99998
查詢結果:user_token_99992
查詢結果:user_token_99994
查詢結果:user_token_99993
查詢結果:user_token_99995
查詢結果:user_token_99990
查詢結果:user_token_99991
查詢結果:user_token_99999
經過本文咱們瞭解到,Redis 中若是要在海量的數據數據中,查詢某個數據應該使用 Scan,Scan 具備如下特徵:
視頻版:www.bilibili.com/video/av880…
關注下面二維碼,訂閱更多精彩內容。