千家信息网

redis的scan语法及作用对象

发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,这篇文章主要讲解了"redis的scan语法及作用对象",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"redis的scan语法及作用对象"吧!redis
千家信息网最后更新 2024年11月26日redis的scan语法及作用对象

这篇文章主要讲解了"redis的scan语法及作用对象",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"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 01) "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 1201) "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 01) "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 31) "0"2) 1) "l"   2) "k"   3) "d"
  • zset(value & score)

127.0.0.1:6379> zscan sortset 01) "0"2) 1) "tom"   2) "89"   3) "jim"   4) "90"   5) "david"   6) "100"
  • hash(key & value)

127.0.0.1:6379> hscan mymap 01) "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 51) "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 "pt@g.cn"     *  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语法及作用对象"的内容了,经过本文的学习后,相信大家对redis的scan语法及作用对象这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

0