redisのscan操作

5330 ワード

redisシリーズ
  • redisのパブリケーション購読機能
  • redisメッセージキュー
  • redisのpipeline
  • redisのscan動作
  • シーケンス
    redisのdbにkeyやdbの中のset,zset,hashの中の要素が大量に存在すると,通常のget all操作ではredisがこの操作でブロックされ,他の操作に応答できない可能性が高く,特に高同時,大量のデータを背景に,この問題は特に深刻に見える.では、データベースのようにページング機能があるかどうか、答えはscan操作です.ここでは主にredis-cliおよびSpringDataRedisでの使用方法を示します.
    scan構文
    scanの後に2つの部分を返して、第1の部分は次回のscanのパラメータで、第2の部分は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) "\xac\xed\x00\x05t\x00\btest-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) "[email protected]"
        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>() {
                @Override
                public Iterable doInRedis(RedisConnection connection) throws DataAccessException {
    
                    List binaryKeys = new ArrayList();
    
                    Cursor 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 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> cursor = template.opsForZSet().scan("sortset",ScanOptions.NONE);
            while (cursor.hasNext()){
                ZSetOperations.TypedTuple item = cursor.next();
                System.out.println(item.getValue() + ":" + item.getScore());
            }
        }

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

    リファレンス
  • redis-scan
  • Not able Scan using redis template
  • redis scanによるデータの反復
  • Redis Scan反復器遍歴動作原理(一)-基礎