zoukankan      html  css  js  c++  java
  • Redis:scan命令

    简介

    我们知道,在redis中,如果以及有非常多的key,那么执行keys *会阻塞redis很长时间,在生产环境是非常危险的。但是如果我们一定要批量扫描redis,那么可以使用redis提供的scan命令。

    scan 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。这一点有点像Elasticsearch的scoll

    查询。

    SCAN 返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。如果新游标返回 0 表示迭代已结束。

    相关命令:

    • SSCAN命令用于迭代集合键中的元素。
    • HSCAN命令用于迭代哈希键中的键值对。
    • ZSCAN命令用于迭代有序集合中的元素(包括元素成员和元素分值)。

    语法

    redis Scan 命令基本语法如下:

    SCAN cursor [MATCH pattern] [COUNT count]
    
    • cursor - 游标。
    • pattern - 匹配的模式。
    • count - 指定从数据集里返回多少元素,默认值为 10 。

    演示

    我这里放了36个key在redis中:

    image-20210701103433086

    执行:

    image-20210701103654762

    image-20210701103705606

    image-20210701103714487

    image-20210701103727319

    Spring Data Redis实现scan

    代码:

        @Autowired
        RedisTemplate<String, Object> redisTemplate;
    
        @Test
        public void testScan(){
            Set<Object> execute = redisTemplate.execute((RedisCallback<Set<Object>>) connection -> {
                Set<Object> binaryKeys = new HashSet<>();
                Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder().match("*").count(10).build());
                while (cursor.hasNext()) {
                    binaryKeys.add(new String(cursor.next()));
                }
                return binaryKeys;
            });
            execute.forEach(System.out::println);
        }
    

    运行结果:

    image-20210701105230886

  • 相关阅读:
    别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(3)
    别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(2)
    别以为真懂Openstack: 虚拟机创建的50个步骤和100个知识点(1)
    High Availability手册(3): 配置
    High Availability手册(2): 架构
    High Availability手册(1): 环境
    Data Center(5): 实例
    Data Center手册(4):设计
    Data Center手册(3): Load Balancer
    了解美杜莎(Medusa)
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14957837.html
Copyright © 2011-2022 走看看