Redis中BigKey的分析与优化

news2025/1/19 11:05:44

Redis中BigKey的分析与优化

Redis以其出色的性能和易用性,在互联网技术栈中占据了重要的地位。
但是,高效的工具使用不当也会成为性能瓶颈。在Redis中,BigKey是常见的性能杀手之一,它们会消耗过多的内存,导致网络拥塞,
甚至引起Redis服务的延迟。因此,合理地处理和预防BigKey的生成,是每个使用Redis的开发者都应该掌握的技能。

&nbsp

BigKey的定义与识别

1、 BigKey的定义
Redis中的BigKey通常指的是那些包含大量元素的复合数据类型,如一个列表包含数百万个元素,或一个字符串的大小超过512MB。
这些BigKey会在执行操作时消耗大量的CPU和内存资源,影响Redis的响应时间。

2、 BigKey的识别方法
手动识别BigKey可以使用如下Redis命令:

redis-cli --bigkeys

自动化识别可以使用脚本来周期性地检测,如下Python脚本示例:

import redis

# 连接到Redis服务器
r = redis.StrictRedis(host='localhost', port=6379, decode_responses=True)

def find_big_keys(redis_conn, threshold):
    cursor = '0'
    big_keys = []
    while cursor != 0:
        cursor, keys = redis_conn.scan(cursor=cursor, count=1000)  # 分批迭代keys
        for key in keys:
            size = redis_conn.memory_usage(key)
            if size > threshold:
                big_keys.append((key, size))
    return big_keys

# 打印出所有大于1MB的key
for key, size in find_big_keys(r, 1024 * 1024):
    print(f"BigKey: {key}, Size: {size}")
    # 还可以使用异步任务,将得到的key放到指定的地方进行存储,方便后面分析处理

这里使用SCAN命令而非KEYS命令,因为SCAN命令是基于游标的迭代器,可以分批次迭代keys,减少对内存的冲击。

这个脚本分批迭代所有的keys,并且仅在发现超过指定大小的key时才会将其信息打印出来或者进行其他操作。
通过设置count参数,你可以根据你的Redis服务器的具体情况来调整每批次处理的keys数量,以达到在不影响Redis性能的前提下完成BigKeys的检测。此外,这个脚本应该在Redis的负载较低时运行,以最小化其对生产环境的影响。

BigKey的产生原因

1、 不合理的数据设计
一个典型的例子是将用户的所有行为数据存放在一个大的List中,而不是分拆成多个小List按时间或者事件类型存储。

2、 业务逻辑变化
随着业务发展,原本预计不会存储大量数据的Key,可能因为用户量的增长或业务逻辑的变化变成了BigKey。

3、 缺失的监控预警
没有及时地监控和预警系统的话,一旦数据量异常增长,就可能产生BigKey,而未能及时发现。

BigKey带来了什么样的问题

1、 性能问题
由于Redis的单线程模型,BigKey的操作可能会阻塞其他命令的执行,造成明显的延迟。

2、 资源消耗
BigKey占用大量内存,可能会导致内存溢出或者其他数据的驱逐。

3、 数据管理问题
BigKey会给数据迁移工作带来挑战,特别是在使用Redis集群时。

BigKey的处理方案

1、 切割大key
可以将一个大的Hash表切割成多个小Hash表,每个Hash表存储一部分数据。

2、 删除或过期
可以对BigKey进行渐进式删除,避免一次性删除造成服务的长时间阻塞。

redis-cli --eval del_big_key.lua , bigkey_name

3、 使用合适的命令
使用Scan系列命令进行数据处理,避免一次性操作大量数据。

redis-cli scan 0 match * count 1000
如何有效避免BigKey产生的策略

1、 合理的数据模型设计
根据业务需求选择合理的数据类型,例如使用小Hash代替大String。
Redis为Hash类型的字段使用了特殊的编码方式,如ziplist或hashtable,这些编码方式可以在保持较小内存占用的同时存储相对较小的值。
当Hash中的元素数量和单个元素的大小达到一定阈值时,Redis会自动从ziplist转换为hashtable,这种优化能够有效利用内存。

 

2、 强化监控预警机制
利用Redis自带的监控工具或第三方监控工具,如 Prometheus + Grafana,及时发现异常。

 

3、 定期的性能评估与优化
定期进行性能评估,及时对数据模型进行调整。

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记和面经,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的阿里大佬写的刷题笔记,让我offer拿到手软

总结

BigKey问题在Redis的使用中是一个不能忽视的问题。通过合理的数据模型设计,强化监控预警机制,以及定期的性能评估,
可以有效地避免BigKey的产生,保持Redis的高性能。我们需要不断地学习和应对新的技术挑战,提升系统的稳定性和可用性。

推荐几个学习 Redis 教程文章

  • 01、Redis 基础教程
  • 02、Redis6.0 系列教程
  • 03、Redis 实战教程

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

专有钉钉开发记录,及问题总结

先放几个专有钉钉开发文档 专有钉钉官网的开发指南 服务端(后端)api文档 前端api文档 前端开发工具下载地址 小程序配置文件下载地址 后端SDK包下载地址 专有钉钉域名是openplatform.dg-work.cn 开发记录 开发专有钉钉时有时会遇到要使用钉钉的api;通过 my 的方…

【leetcode题解C++】101.对称二叉树 and 111.二叉树的最小深度 and 222.完全二叉树的节点个数 and 110.平衡二叉树

101. 对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false 思路&#xff1a…

Pandas.Series.mode() 众数 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本: 本文基于 pandas2.2.0 编写。 关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。 传送门: Pandas API参考目录 传送门: Pandas 版本更新及新特性 传送门&…

Blender教程(基础)-物体添加-03

1、打开的界面如下图会存在3个物体、英文状态下按键盘字母A全选、然后按键盘delete删除。 删除后一片空白 2、新增物体 方式1:在英文状态下按键盘shiftA组合键弹出如下添加物体弹窗 方式2:在菜单下找到添加点击弹出添加选项 3、举例新增物体 采用上述…

MongoDB本地部署并结合内网穿透实现公网访问本地数据库

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 4. 结语 前言 MongoDB是一个基于分布式文件…

Gin 应用多实例部署session问题、session参数与刷新

文章目录 一、Gin Session 存储的实现方案二、memstore:基于内存的实现2.1 基本使用2.2 关键参数 三、使用redis:多实例部署3.1 使用redis优势3.2 基本使用 四、信息安全的三个核心概念五、Gin Session 参数5.1 参数介绍 六、Session 自动刷新 一、Gin S…

idea中yml文件没有提示解决办法

两步解决yml文件不显示提示,yaml文件显示提示问题 1、在插件中心,先下载下图两个插件 2、在Editor》File Types新增文件类型,文件名匹配规则需要将yaml和yml的都加上,加好之后,重启idea,即刻生效。

《汇编语言:基于linux环境》eatsyscall汇编程序

当阅读此书,作者编写了一个这样的程序,我也想试一下。照着书中的代码写了下,可以使用nasm正常编译,ld也可以正常链接,但是无法正常执行。总是报错。 ; nasm -f elf64 -g -F stabs eatsyscall.asm ; ld -o eatsysca…

CTF CRYPTO 密码学-6

题目名称:敲击 题目描述: 方方格格,不断敲击 “wdvtdz qsxdr werdzxc esxcfr uygbn” 解题过程: step1:根据题目描述敲击,wdvtdz对应的字符为x step2:依此类推r,z,o&…

张维迎《博弈与社会》笔记(4)导论:社会最优与帕累托标准

本节我们将从社会的角度来评判人类行为:一个社会应该采取什么样的标准来判断个人行为?具体地讲,我们需要知道,从社会的角度来评判,什么样的行为是正当的,什么样的行为是不正当的;什么样的行为应…

安装 java 的 JDK

前几天重装系统以后想起来要重装 java 的JDK 安装地址 Windows 下的 JDK 数据包有三种可选的下载:Windows x64 Compressed Archive、Windows x64 Installer 和 Windows x64 MSI Installer。其中,前者为 JDK 的免安装版本,后两者均为 JDK 的离…

05-Nacos-配置中心接入

1、pom依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency> 2、配置文件 spring:application:name: nacos-config## 当前环境&#xff0c;这个和…

【JS基础】事件对象event、环境对象this、事件的高级操作

文章目录 一、事件对象1.1 事件对象是什么&#xff1f;1.2 使用方法 二、环境对象this以及回调函数2.1 它是什么&#xff1f;2.2 演示示例 三、事件的高级操作3.1 事件流3.2 事件捕获3.3 事件冒泡以及阻止冒泡3.4 事件解绑3.5 mouseover和mouseenter事件的区别3.6 事件委托它是…

架构篇21:高性能负载均衡-算法

文章目录 轮询加权轮询负载最低优先性能最优类Hash 类源地址 HashID Hash小结负载均衡算法数量较多,而且可以根据一些业务特性进行定制开发,抛开细节上的差异,根据算法期望达到的目的,大体上可以分为下面几类。 任务平分类:负载均衡系统将收到的任务平均分配给服务器进行处…

MongoDB:从容器使用到 Mongosh、Python/Node.js 数据操作

文章目录 1. 容器与应用之间的关系介绍2. 使用 Docker 容器安装 MongoDB3. Mongosh 操作3.1 Mongosh 连接到 MongoDB3.2 基础操作与 CRUD 4. Python 操作 MongoDB5. Nodejs 操作 MongoDB参考文献 1. 容器与应用之间的关系介绍 MongoDB 的安装有时候并不是那么容易的&#xff0…

C++:模板特化 非类型模板参数

目录 1.非类型模板参数 2.模板特化 2.1 为什么需要模板特化 2.2 函数模板特化 2.3 类模板特化 1.全特化 2.偏特化 1.部分特化 2.参数更进一步的限制 1.非类型模板参数 模板参数分类类型形参与非类型形参 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在 cl…

java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数

java正则校验&#xff0c;手机号&#xff0c;邮箱&#xff0c;日期格式&#xff0c;时间格式&#xff0c;数字金额两位小数 3.58是否为金额&#xff1a;true 3.582是否为金额&#xff1a;false 1284789qq.com是否为email&#xff1a;true 1284789qq.com是否为email&#xff1…

01_Anaconda环境搭建

概述 Anaconda包含了许多常用的科学计算和数据分析的库和工具。通过Anaconda&#xff0c;用户可以更方便地安装、管理和更新这些库和工具&#xff0c;从而提高工作效率。 Anaconda还提供了一个名为conda的包管理器&#xff0c;可以帮助用户方便地安装、管理和更新这些库和工具…

linux 基于科大讯飞的文字转语音使用

官方文档地址&#xff1a;离线语音合成 Linux SDK 文档 | 讯飞开放平台文档中心 一、SDK下载 1、点击上面官方文档地址的链接&#xff0c;可以跳转到以下界面。 2、点击“普通版”&#xff0c;跳转到以下界面。 3、点击“下载”跳转到以下界面 4、最后&#xff0c;点击“SDK下…

AI编译器的前端优化策略

背景 工作领域是AI芯片工具链相关&#xff0c;很多相关知识的概念都是跟着项目成长建立起来&#xff0c;但是比较整个技术体系在脑海中都不太系统&#xff0c;比如项目参与中涉及到了很多AI编译器开发相关内容&#xff0c;东西比较零碎&#xff0c;工作中也没有太多时间去做复盘…