站長資訊網
        最全最豐富的資訊網站

        一起聊聊redis的scan操作

        redis系列

        • redis的發布訂閱功能
        • redis消息隊列
        • redis的pipeline
        • redis的scan操作

        在redis的db存在大量key或者db里頭的某個set、zset、hash里頭的元素非常多的話,用普通的get all操作很可能導致redis因為這個操作阻塞了,導致不能響應其他操作,特別是在高并發、海量數據的背景下,這個問題顯得尤其嚴重。那么能不能像數據庫那樣有個分頁的功能呢,答案就是scan操作。本文主要展示怎么在redis-cli以及SpringDataRedis中的使用。【推薦:redis視頻教程】

        scan語法

        scan之后返回兩部分,第一部分是下次scan的參數,第二部分就是scan出來的項

        作用對象(db、set、zset、hash)

        • db(key)
        127.0.0.1:6379> scan 0 1) "120" 2)  1) "articleMap:63"     2) "articleMap:37"     3) "counter:__rand_int__"     4) "articleMap:60"     5) "tagSet:tag5"     6) "articleMap:80"     7) "messageCache~keys"     8) "mymap"     9) "articleMap:46"    10) "articleMap:55" 127.0.0.1:6379> scan 120 1) "28" 2)  1) "articleMap:17"     2) "tagSet:tag1"     3) "articleMap:18"     4) "articleMap:81"     5) "xacxedx00x05tx00btest-cas"     6) "articleMap:51"     7) "articleMap:94"     8) "articleMap:26"     9) "articleMap:71"    10) "user-abcde"
        • set(value)
        127.0.0.1:6379> sscan myset 0 1) "3" 2)  1) "m"     2) "j"     3) "c"     4) "h"     5) "f"     6) "i"     7) "a"     8) "g"     9) "n"    10) "e"    11) "b" 127.0.0.1:6379> sscan myset 3 1) "0" 2) 1) "l"    2) "k"    3) "d"
        • zset(value & score)
        127.0.0.1:6379> zscan sortset 0 1) "0" 2) 1) "tom"    2) "89"    3) "jim"    4) "90"    5) "david"    6) "100"
        • hash(key & value)
        127.0.0.1:6379> hscan mymap 0 1) "0" 2)  1) "name"     2) "codecraft"     3) "email"     4) "pt@g.cn"     5) "age"     6) "20"     7) "desc"     8) "hello"     9) "sex"    10) "male"

        SCAN的額外參數

        • count(指定每次取多少條)
        127.0.0.1:6379> scan 0 count 5 1) "240" 2) 1) "articleMap:63"    2) "articleMap:37"    3) "counter:__rand_int__"    4) "articleMap:60"    5) "tagSet:tag5"
        • match(匹配key)
        127.0.0.1:6379> scan 0 match article* 1) "120" 2) 1) "articleMap:63"    2) "articleMap:37"    3) "articleMap:60"    4) "articleMap:80"    5) "articleMap:46"    6) "articleMap:55"

        RedisTemplate操作

        遍歷數據庫key

        @Test     public void scanDbKeys(){         template.execute(new RedisCallback<Iterable<byte[]>>() {             @Override             public Iterable<byte[]> doInRedis(RedisConnection connection) throws DataAccessException {                  List<byte[]> binaryKeys = new ArrayList<byte[]>();                  Cursor<byte[]> cursor = connection.scan(ScanOptions.scanOptions().count(5).build());                 while (cursor.hasNext()) {                     byte[] key = cursor.next();                     binaryKeys.add(key);                     System.out.println(new String(key, StandardCharsets.UTF_8));                 }                  try {                     cursor.close();                 } catch (IOException e) {                     // do something meaningful                 }                  return binaryKeys;             }         });     }

        遍歷set

        /**      * sadd myset a b c d e f g h i j k l m n      */     @Test     public void scanSet(){         Cursor<String> cursor = template.opsForSet().scan("myset",ScanOptions.NONE);         while (cursor.hasNext()){             System.out.println(cursor.next());         }     }

        遍歷zset

        /**      * zadd sortset 89 tom 90 jim 100 david      */     @Test     public void scanZSet(){         Cursor<ZSetOperations.TypedTuple<String>> cursor = template.opsForZSet().scan("sortset",ScanOptions.NONE);         while (cursor.hasNext()){             ZSetOperations.TypedTuple<String> item = cursor.next();             System.out.println(item.getValue() + ":" + item.getScore());         }     }

        遍歷hash

        /**      *  hset mymap name "codecraft"      *  hset mymap email "pt@g.cn"      *  hset mymap age 20      *  hset mymap desc "hello"      *  hset mymap sex "male"      */     @Test     public void scanHash(){         Cursor<Map.Entry<Object, Object>> curosr = template.opsForHash().scan("mymap", ScanOptions.NONE);         while(curosr.hasNext()){             Map.Entry<Object, Object> entry = curosr.next();             System.out.println(entry.getKey()+":"+entry.getValue());         }     }

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久国产成人亚洲精品影院| 亚洲А∨精品天堂在线| 久久精品国产精品亜洲毛片| A级精品国产片在线观看| 欧美日韩精品系列一区二区三区国产一区二区精品 | 亚洲国产精品一区二区三区久久 | 亚洲国产主播精品极品网红 | 国产精品v片在线观看不卡| 亚洲AV日韩精品一区二区三区| 成人精品一区二区久久| 国产精品久久久久久吹潮| 亚洲AV无码久久精品色欲| 日本国产精品久久| 国产欧美日本亚洲精品一5| 久热这里只精品99re8久| 国产精品女同一区二区| 亚洲AV无码成人网站久久精品大 | 精品国产三级a∨在线欧美| 亚洲AV午夜福利精品一区二区| 四虎永久在线精品免费一区二区| 中文精品人人永久免费| 国产福利精品视频自拍 | 亚洲午夜精品久久久久久浪潮| 精品久久久久久久中文字幕| 国产精品免费一区二区三区| 99久久www免费人成精品| 亚洲国产精品一区二区久久| 久久九九有精品国产23百花影院| 成人国产精品高清在线观看| 国产国产精品人在线观看| 精品久久久久久亚洲精品 | 少妇人妻无码精品视频app| 最新在线精品国自av| 中文字幕久精品免费视频| 亚洲一区二区精品视频| 亚洲精品线路一在线观看| 亚洲性日韩精品一区二区三区| 中文字幕久精品免费视频| 久久久无码人妻精品无码| 精品人妻码一区二区三区| 91国内外精品自在线播放|