登录  /  注册
首页 > 数据库 > Redis > 正文

一起聊聊redis的scan操作

藏色散人
发布: 2021-09-11 17:00:51
转载
2468人浏览过
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) "\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"
登录后复制

RedisTemplate操作

遍历数据库key

@Test
    public void scanDbKeys(){
        template.execute(new RedisCallback<iterable>&gt;() {
            @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;
            }
        });
    }</byte></byte></byte></byte></iterable>
登录后复制

遍历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());
        }
    }</string>
登录后复制

遍历zset

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

遍历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>&gt; curosr = template.opsForHash().scan("mymap", ScanOptions.NONE);
        while(curosr.hasNext()){
            Map.Entry<object> entry = curosr.next();
            System.out.println(entry.getKey()+":"+entry.getValue());
        }
    }</object></map.entry>
登录后复制

以上就是一起聊聊redis的scan操作的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:segmentfault网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号