大厂面试真题:简单说下Redis的bigkey
什么是bigkey
bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储23-1个元素。
如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。
字符串类型:体现在单个value值很大,一般认为超过10KB就是bigkey,但这个值和具体的OPS相关。
非字符串类型:哈希、列表、集合、有序集合,体现在元素个数过多。
bigkey无论是空间复杂度和时间复杂度都不太友好,下面我们将介绍它的危害。
bigkey的危害
bigkey的危害体现在三个方面:
1、内存空间不均匀.(平衡):例如在Redis Cluster中,bigkey 会造成节点的内存空间使用不均匀。
2、超时阻塞:由于Redis单线程的特性,操作bigkey比较耗时,也就意味着阻塞Redis可能性增大。
3、网络拥塞:每次获取bigkey产生的网络流量较大
假设一个bigkey为1MB,每秒访问量为1000,那么每秒产生1000MB 的流量,对于普通的千兆网卡(按照字节算是128MB/s)的服务器来说简直是灭顶之灾,而且一般服务器会采用单机多实例的方式来部署,也就是说一个bigkey可能会对其他实例造成影响,其后果不堪设想。
bigkey的存在并不是完全致命的:
如果这个bigkey存在但是几乎不被访问,那么只有内存空间不均匀的问题存在,相对于另外两个问题没有那么重要紧急,但是如果bigkey是一个热点key(频繁访问),那么其带来的危害不可想象,所以在实际开发和运维时一定要密切关注bigkey的存在。
bigKey的发现
检测Redis中的bigkey(大键)是Redis运维和优化中的一项重要任务,因为bigkey可能导致内存占用过高、网络传输成本增加、CPU消耗增多以及数据一致性维护困难等问题。以下是几种线上可用的检测Redis bigkey的方案:
1. 使用redis-cli工具的--bigkeys参数
Redis 4.0及以上版本提供了--bigkeys
命令,该命令可以自动扫描Redis中的所有键,并报告哪些键是大键。使用方法如下:
bash复制代码
redis-cli --bigkeys |
或者,如果Redis设置了密码,需要加上-a
参数:
bash复制代码
redis-cli -a yourpassword --bigkeys |
这个命令会遍历数据库中的所有键,并统计每个键的内存占用情况,最后输出一个报告,指出哪些键比较大。
2. 使用SCAN命令结合MEMORY USAGE命令
如果Redis版本不支持--bigkeys
命令,可以使用SCAN命令遍历所有键,并结合MEMORY USAGE命令来检查每个键的内存使用情况。SCAN命令是Redis提供的一个增量式迭代命令,可以遍历键空间中的键,而不会阻塞服务器。
示例命令如下:
bash复制代码
# 遍历所有键 | |
SCAN 0 MATCH * COUNT 1000 | |
# 对于每个返回的键,使用MEMORY USAGE命令检查其内存占用 | |
MEMORY USAGE keyname |
然而,由于需要手动编写脚本来处理这个过程,这种方法相对繁琐。
3. 编写脚本自动检测
可以编写一个Python或Shell脚本来自动化检测过程。脚本将使用SCAN命令迭代Redis中的键,并使用MEMORY USAGE或DEBUG OBJECT命令来获取每个键的内存占用情况。然后,脚本可以设置一个阈值,将超过该阈值的键视为bigkey,并记录下来。
4. 分析RDB文件
Redis在持久化时会产生RDB(Redis Database Backup)文件,该文件包含了Redis在某个时间点的快照。通过分析RDB文件,可以找出大键。这种方法通常用于离线分析,因为分析RDB文件可能会比较耗时,并且需要停止Redis服务或进行快照备份。
5. 使用第三方工具
还有一些第三方工具可以帮助检测Redis中的bigkey,如Redis Desktop Manager、Redisson等。这些工具提供了图形化界面,可以方便地查看Redis中的数据,并检测大键。
6. 慢查询监控和Redis时延带宽监控
虽然不是直接检测bigkey的方法,但慢查询监控和Redis时延带宽监控可以帮助识别可能的性能瓶颈,这些瓶颈可能与bigkey有关。通过监控Redis的慢查询日志和性能指标,可以及时发现并处理潜在的bigkey问题。
总结
检测Redis中的bigkey有多种方法,包括使用redis-cli工具的--bigkeys参数、SCAN命令结合MEMORY USAGE命令、编写脚本自动检测、分析RDB文件以及使用第三方工具等。选择哪种方法取决于具体的需求和场景。在实际应用中,建议结合多种方法来确保检测的准确性和全面性。
解决bigkey
解决Redis中的bigkey问题,可以从多个方面入手,以下是一些有效的解决方案:
1. 拆分大key
- 拆分为多个小key:将一个大key拆分成多个小key,每个小key存储部分数据。这种方法可以显著降低单个key的内存占用,减少对Redis性能的影响。例如,一个大的哈希表可以拆分成多个小的哈希表,或者一个大的列表可以拆分成多个小的列表。
- 使用hash结构存储:拆分后的小key可以使用hash结构来存储,这样既可以方便地管理数据,也可以提高数据的查询效率。
2. 压缩存储
- 对大key的value进行压缩:使用压缩算法(如zlib)对大key的value进行压缩,减小存储在Redis中的数据大小。压缩后的数据在Redis中占用更少的内存,从而降低了对Redis性能的影响。同时,在读取数据时再进行解压缩,确保数据的完整性。
3. 选用合适的数据结构
- 根据数据特性选择数据结构:Redis提供了多种数据结构(如列表、集合、有序集合、哈希表等),可以根据数据的实际特性和访问模式来选择合适的数据结构。合适的数据结构能够更高效地存储和访问数据,降低bigkey的发生概率。
4. 数据迁移
- 将大key迁移到其他存储系统:如果Redis中的某些大key不再需要频繁访问,或者数据量极大以至于对Redis性能造成了严重影响,可以考虑将这些大key迁移到其他存储系统(如数据库或分布式文件系统)中。这样可以减轻Redis集群的压力,提高Redis的性能和稳定性。
5. 优化读写操作
- 增加缓存层:对于频繁读写的大key,可以在应用层面增加缓存层,减少对Redis的直接访问。
- 异步处理:对于大key的读写操作,可以采用异步处理的方式,降低对Redis的即时性能影响。
6. 分布式缓存
- 采用分布式缓存架构:将大key数据分布到多个Redis节点上,通过分布式缓存来提高系统的扩展性和稳定性。这样可以将大key的存储和访问负载分散到多个节点上,减轻单个节点的压力。
7. 监控和定期清理
- 定期监控Redis中的大key:使用Redis提供的工具或命令(如SCAN、MEMORY USAGE等)定期监控Redis中的大key情况。
- 根据需要进行清理:对于已经过时或不再需要的大key进行清理,释放内存空间,提高Redis的性能和稳定性。
8. 设计阶段避免
- 在设计阶段避免产生bigkey:在设计和规划Redis数据结构时,应该充分考虑数据量的大小和访问频率,避免产生bigkey。例如,可以通过合理的分片策略、选择合适的数据结构、设置合理的过期时间等方式来避免bigkey的产生。
综上所述,解决Redis中的bigkey问题需要从多个方面入手,包括拆分大key、压缩存储、选用合适的数据结构、数据迁移、优化读写操作、分布式缓存、监控和定期清理以及在设计阶段避免产生bigkey等。通过这些措施的综合应用,可以有效地降低bigkey对Redis性能的影响,提高Redis的稳定性和可靠性。
相关文章:
大厂面试真题:简单说下Redis的bigkey
什么是bigkey bigkey是指key对应的value所占的内存空间比较大,例如一个字符串类型的value可以最大存到512MB,一个列表类型的value最多可以存储23-1个元素。 如果按照数据结构来细分的话,一般分为字符串类型bigkey和非字符串类型bigkey。 字…...
18 vue3之自动引入ref插件深入使用v-model
自动引入插件后无需再引入ref等 使用自动引入插入无需在import { ref, reactive } from "vue"做这样的操作 npm i unplugin-auto-import - D vite配置 import AutoImport from unplugin-auto-import/vite //使用vite版本 export default defineConfig({plugins: [v…...

【Spring】lombok、dbUtil插件应用
一、lombok插件 1. 功能:对实体类自动,动态生成get、set方法,无参、有参构造..... 2. 步骤: (1)idea安装插件(只做一次) (2)添加坐标 (3)编写注解 NoArgsCo…...
【学习笔记】WSL
WSL 1、 介绍 1.1、概述 1.2、版本 1.3、配置安装 2、 基本 2.1、基本命令 1、 介绍 1.1、概述 WSL 是 Windows Subsystem for Linux 的缩写,中文称为 Windows 下的 Linux 子系统。它是微软在 Windows 上提供的一种功能,允许用户在 …...
python assert 断言用法
语法: try:assert 条件表达式, "可选的错误消息" except AssertionError as error:print(f"断言失败:{error}")其中, try...except是异常处理语法结构,try可以测试代码块中的错误,并在出现异常时…...

MySQL事务、索引、数据恢复和备份
MySQL事务、索引、数据恢复和备份 1.MySQL的事务处理 事务就是将一组SQL语句放在同一批次内去执行 如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行 MySQL的事务实现方法 : SET AUTOCOMMIT 使用SET语句来改变自动提交模式 SET AUTOCOMMIT 0; # 关…...
什么是chatgpt?国内有哪些类gpt模型?
什么是ChatGPT? “ChatGPT”这个名字越来越多地出现在我们的生活中。简单来说,ChatGPT是OpenAI开发的一种人工智能对话模型。它基于GPT(Generative Pre-trained Transformer,生成式预训练变换模型)架构,能…...
ISP基本框架及算法介绍 ISP(Image Signal Processor)
ISP基本框架及算法介绍 ISP(Image Signal Processor),即图像处理,主要作用是对前端图像传感器输出的信号做后期处理,主要功能有线性纠正、噪声去除、坏点去除、内插、白平衡、自动曝光控制等,依赖于ISP才能在不同的光学条件…...
Stable Diffusion 的 ControlNet 主要用途
SD(Stable Diffusion)中的ControlNet是一种条件生成对抗神经网络(Conditional Generative Adversarial Network, CGAN)的扩展技术,它允许用户通过额外的输入条件来控制预训练的大模型(如Stable Diffusion&a…...

矩阵分析 学习笔记4 内积与Gram矩阵
内积 定义 由于对称,第二变元线性那第一变元也线性了。例如这个:...

iOS 消息机制详解
应用 解决NSTimer、CADisplayLink循环引用。 二者都是基于runloop的定时器,由于处理事件内容不一样,runloop 每运行一次运行耗时就不一样,无法准确的定时触发timer的事件。 NSProxy 与 NSObject 如果继承自NSProxy 直接开始消息转发&…...
深入理解Spring Data JPA与接口编程
目录 1. 什么是Spring Data JPA? 2. 如何使用Spring Data JPA? 3. 示例代码 4. 使用Query注解 5. 拓展知识:接口编程的好处 6. 结论 在软件开发领域,接口(Interface)是一种定义了方法签名但没有实现的…...

Wireshark学习使用记录
wireshark 是一个非常好用的抓包工具,使用 wireshark 工具抓包分析,是学习网络编程必不可少的一项技能。 原理 Wireshark使用的环境大致分为两种:一种是电脑直连互联网的单机环境,另外一种就是应用比较多的互联网环境,也就是连接…...

OpenCV特征检测(9)检测图像中直线的函数HoughLines()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在二值图像中使用标准 Hough 变换查找直线。 该函数实现了用于直线检测的标准 Hough 变换或标准多尺度 Hough 变换算法。详见 http://homepages…...

力扣 中等 445.两数相加 II
文章目录 题目介绍题解 题目介绍 题解 首先反转两个链表,再调用 2. 两数相加 链接的代码,得到链表,最后将其翻转即可。 class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {l1 reverseList(l1);l2 reverseList(l…...

华为云徐峰:AI赋能应用现代化,加速软件生产力跃升
2024年9月19日,在华为全联接大会2024的“AI赋能应用现代化,加速软件生产力跃升”论坛上,华为云PaaS服务产品部部长徐峰发表了主题演讲,介绍了未来应用智能化演进趋势,分享了智能化应用的行业实践,并发布了华…...

C发送邮件技巧:如何批量发送个性化邮件?
C发送邮件的高效步骤指南?C语言怎么实现SMTP发邮件? 为了提高邮件营销的效果,掌握C发送邮件的技巧,特别是如何批量发送个性化邮件,显得尤为重要。AokSend将详细介绍C发送邮件的技巧,帮助您在邮件营销中取得…...

基于python+spark的外卖餐饮数据分析系统设计与实现(含论文)-Spark毕业设计选题推荐
博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...

权限维持——Linux
前提 已经提权到管理员权限 一、创建账户 1、创建一个自定义密码的账户 已知,Linux中所有的用户的信息 存储在/etc/passwd这个文件中 。可以利用管理员权限修改这个文件, 添加一个账户 。 利用linux中的密码的编码算法 生成对应密码 (不知…...

申请SSL证书闭坑方法
上来先问一个问题,为什么自己不能成立CA机构发SSL证书产品?为什么有的CA机构不能发被信任SSL证书产品? 真正原因是,SSL证书里面的根证书需要提前放入操作系统及浏览器,然而这些浏览器和操作系统的版本很多,…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...