本題考察的知識點有如下幾個: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 10000 1) "127064" 2) 1) "user_token_99997" 127.0.0.1:6379> scan 127064 match user_token_9999* count 10000 1) "1740" 2) 1) "user_token_9999" 127.0.0.1:6379> scan 1740 match user_token_9999* count 10000 1) "21298" 2) 1) "user_token_99996" 127.0.0.1:6379> scan 21298 match user_token_9999* count 10000 1) "65382" 2) (empty list or set) 127.0.0.1:6379> scan 65382 match user_token_9999* count 10000 1) "78081" 2) 1) "user_token_99998" 2) "user_token_99992" 127.0.0.1:6379> scan 78081 match user_token_9999* count 10000 1) "3993" 2) 1) "user_token_99994" 2) "user_token_99993" 127.0.0.1:6379> scan 3993 match user_token_9999* count 10000 1) "13773" 2) 1) "user_token_99995" 127.0.0.1:6379> scan 13773 match user_token_9999* count 10000 1) "47923" 2) (empty list or set) 127.0.0.1:6379> scan 47923 match user_token_9999* count 10000 1) "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 10000 1) "0" 2) (empty list or set) 複製代碼
從以上的執行結果,咱們看出兩個問題:markdown
相關語法:scan cursor [MATCH pattern] [COUNT count]
ide
其中:oop
本文咱們使用 Java 代碼來實現 Scan 的查詢功能,代碼以下:spa
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); } } } } 複製代碼
以上程序執行結果以下:code
查詢結果:user_token_99997orm
查詢結果: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…
關注下面二維碼,訂閱更多精彩內容。