当前位置: 首页 > news >正文

【Redis】大key的处理

文章目录

  • 什么是Redis的大key?
  • 如何发现大key
  • 如何删除大key?

什么是Redis的大key?

  • String类型的值大于10kb
  • hash、list、set、zset的元素个数超过5000个

只要满足上面二者之一,我们都称这个key为大key(big key)

如何发现大key

  • redis-cli --bigkeys
    利用redis-cli提供的–bigkeys参数,可以遍历分析所有的key,并返回key的整体统计信息与每个数据的最大的那个大key

redis-cli -h 127.0.0.1 -p 6379 -a “password” --bigkeys

  • 第三方工具
    使用Redis-Rdb-Tools分析RDB快照文件,全面分析内存使用情况

rdb dump.rdb -c memory --bytes 10240 -f redis.csv

  • scan扫描
    自己编写代码,使用scan扫描Redis中的所有key,利用strlen、hlen等命令判断key的长度(此处不建议使用MEMORY USAGE)
    private Jedis jedis;

    @BeforeEach
    void setUp() {
        // 1.建立连接
        // jedis = new Jedis("192.168.150.101", 6379);
        jedis = JedisConnectionFactory.getJedis();
        // 2.设置密码
        jedis.auth("123321");
        // 3.选择库
        jedis.select(0);
    }

final static int STR_MAX_LEN = 10 * 1024;
    final static int HASH_MAX_LEN = 500;

    @Test
    void testScan() {
        int maxLen = 0;
        long len = 0;

        String cursor = "0";
        do {
            // 扫描并获取一部分key
            ScanResult<String> result = jedis.scan(cursor);
            // 记录cursor
            cursor = result.getCursor();
            List<String> list = result.getResult();
            if (list == null || list.isEmpty()) {
                break;
            }
            // 遍历
            for (String key : list) {
                // 判断key的类型
                String type = jedis.type(key);
                switch (type) {
                    case "string":
                        len = jedis.strlen(key);
                        maxLen = STR_MAX_LEN;
                        break;
                    case "hash":
                        len = jedis.hlen(key);
                        maxLen = HASH_MAX_LEN;
                        break;
                    case "list":
                        len = jedis.llen(key);
                        maxLen = HASH_MAX_LEN;
                        break;
                    case "set":
                        len = jedis.scard(key);
                        maxLen = HASH_MAX_LEN;
                        break;
                    case "zset":
                        len = jedis.zcard(key);
                        maxLen = HASH_MAX_LEN;
                        break;
                    default:
                        break;
                }
                if (len >= maxLen) {
                    System.out.printf("Found big key : %s, type: %s, length or size: %d %n", key, type, len);
                }
            }
        } while (!cursor.equals("0"));
    }

如何删除大key?

直接删除大key会造成阻塞,因为redis是单线程执行,阻塞期间,其他所有请求可能都会超时。超时越来越多,会造成redis连接耗尽,产生各种异常。

  • 低峰期删除:凌晨,观察QPS(每秒查询量Query Per Second),选择低的时候,无法彻底解决阻塞,不过损失将会降低
  • 分批吹删除:对于hash,使用hscan扫描法,对于集台采用srandmember每次随机取数据进行删除。对于有序集台可以使用zremrangebyrank直接删除,对于列表直接pop即可。
  • 异步删除法:在Redis4.0之后,产生了一个unlink方法,用unlink代替del来删除,这样redis会将这个key放入到一个异步线程中,进行删除,这样不会阻塞主线程。

相关文章:

  • T-3.2-把Redis当作消息队列合不合适
  • 简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW个人网站制作成品 web网页制作与实现
  • java基于springboot+element的实现医院预约挂号系统 nodejs
  • 在vue项目中使用canvas实现甘特图
  • 【C++】之模板进阶
  • 100天精通Python(数据分析篇)——第58天:Pandas读写数据库(read_sql、to_sql)
  • Bean的生命周期
  • 哈希桶(详解创建)
  • 回归预测 | MATLAB实现SSA-BP多输入单输出回归预测
  • 【雅思备考】听说读写攻略 | 雅思核心词汇之科技类
  • Python-列表,从基础到进阶用法大总结,进来查漏补缺
  • JDBC模拟SQL注入和避免SQL注入
  • flink在企业IT架构中如何定位-在选型流批一体技术与大数据架构时的避坑指南
  • JUC并发编程之CompletableFuture基础用法
  • SpringBoot+Mybatis-Plus多数据源使用
  • Android组件 - 收藏集 - 掘金
  • canvas 高仿 Apple Watch 表盘
  • CAP 一致性协议及应用解析
  • Hexo+码云+git快速搭建免费的静态Blog
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java应用性能调优
  • leetcode388. Longest Absolute File Path
  • Making An Indicator With Pure CSS
  • Netty源码解析1-Buffer
  • pdf文件如何在线转换为jpg图片
  • React系列之 Redux 架构模式
  • Shell编程
  • Travix是如何部署应用程序到Kubernetes上的
  • 浮现式设计
  • 复习Javascript专题(四):js中的深浅拷贝
  • 如何编写一个可升级的智能合约
  • 微信小程序填坑清单
  • 原生js练习题---第五课
  • 【云吞铺子】性能抖动剖析(二)
  • Nginx实现动静分离
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #Z2294. 打印树的直径
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (八)Spring源码解析:Spring MVC
  • (七)理解angular中的module和injector,即依赖注入
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (算法)求1到1亿间的质数或素数
  • (转)Android学习笔记 --- android任务栈和启动模式
  • ***详解账号泄露:全球约1亿用户已泄露
  • .gitignore文件设置了忽略但不生效
  • .net MySql
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net专家(高海东的专栏)
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [Bada开发]初步入口函数介绍