>  기사  >  데이터 베이스  >  Redis의 스캔 작업에 대해 이야기해 보겠습니다.

Redis의 스캔 작업에 대해 이야기해 보겠습니다.

藏色散人
藏色散人앞으로
2021-09-11 17:00:512723검색
redis 시리즈
  • redis 게시 및 구독 기능
  • redis 메시지 큐
  • redis 파이프라인
  • redis 스캔 작업

sequence

에 많은 수의 키 또는 키가 있습니다. redis db db에 set, zset, hash의 요소가 많은 경우 일반적인 get all 작업을 사용하면 이 작업으로 인해 redis가 차단되어 다른 작업에 응답하지 못하게 될 가능성이 높으며, 특히 높은 동시성과 대용량 데이터의 맥락에서 이 문제는 특히 심각한 것으로 보입니다. 그렇다면 데이터베이스와 같은 페이징 기능을 가질 수 있습니까? 답은 스캔 작업입니다. 이번 글에서는 주로 redis-cli와 SpringDataRedis에서 어떻게 사용하는지 보여드리겠습니다. [추천: redis 비디오 튜토리얼]

scan 구문

스캔 후 두 부분이 반환됩니다. 첫 번째 부분은 다음 스캔의 매개 변수이고 두 번째 부분은 scan

Action 개체(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) "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"

set()

@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;
            }
        });
    }

zset(값 및 점수 )

/**
     * 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());
        }
    }

hash(키 및 값)

/**
     * 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());
        }
    }
🎜SCAN의 추가 매개변수🎜🎜🎜count(매번 가져갈 항목 수 지정)🎜🎜
/**
     *  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());
        }
    }
🎜🎜match (일치 키)🎜🎜rrreee🎜RedisTemplate 작업🎜🎜Traverse 데이터베이스 키🎜rrreee🎜Traverse set🎜rrreee🎜Traverse zset🎜rrreee🎜Traverse hash🎜rrreee 🎜

위 내용은 Redis의 스캔 작업에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제