缓存 --- Redis性能瓶颈和大Key问题

缓存 --- Redis性能瓶颈和大Key问题

  • 内存瓶颈
  • 网络瓶颈
  • CPU 瓶颈
  • 持久化瓶颈
  • 大key问题
    • 优化方案

  • Redis 是一个高性能的内存数据库,但在实际使用中,可能会在内存、网络、CPU、持久化、大键值对等方面遇到性能瓶颈。下面从这些方面详细分析 Redis 的性能瓶颈,并给出相应的解决方法。

内存瓶颈

问题

  • Redis 是一个基于内存的数据库,所有数据都存储在内存中,因此内存容量是 Redis 的主要限制。
  • 当数据量超过可用内存时,Redis 可能会触发内存淘汰策略(如 LRU、LFU),导致部分数据被删除。
  • 大键值对(如大哈希表、大列表)会占用大量内存,进一步加剧内存压力。

解决方法

  • 优化数据结构:使用更高效的数据结构(如压缩列表、整数集合)来减少内存占用。
  • 启用内存淘汰策略:根据业务需求配置合适的内存淘汰策略(如 volatile-lruallkeys-lru)。
  • 分片存储:使用 Redis Cluster 将数据分布到多个节点,分散内存压力。
  • 数据压缩:在客户端对数据进行压缩后再存储到 Redis 中。
  • 监控内存使用:定期监控 Redis 的内存使用情况,及时发现和解决内存问题。

网络瓶颈

问题

  • Redis 的性能高度依赖于网络,尤其是在高并发或跨地域部署的场景下。
  • 网络延迟和带宽限制会影响 Redis 的响应速度。
  • 大量小请求可能导致网络拥塞,增加 Redis 的负载。

解决方法

  • 减少网络请求:使用批量操作(如 MGETMSET)减少网络请求次数。
  • 优化Redis客户端连接池:配置合理的客户端连接池,避免连接数过多或过少。
  • 使用内存缓存: 可考虑将一些数据量不大,并且对一致性要求不高的数据移至内存缓存
  • 就近部署:将 Redis 部署在离客户端较近的位置,减少网络延迟。
  • 监控网络流量:定期监控 Redis 的网络流量,及时发现和解决网络瓶颈。

CPU 瓶颈

问题

  • Redis 的核心处理逻辑是单线程的(Redis 6.0 引入了多线程 I/O,但命令执行仍然是单线程的)。
  • 复杂命令(如 SORTZUNIONSTORE)或长耗时操作(如 KEYS *FLUSHALL)会占用大量 CPU 资源,阻塞其他命令的执行。

解决方法

  • 避免复杂命令:使用高效命令替代复杂命令(如 SCAN 替代 KEYS *)。
  • 使用多线程 I/O:在 Redis 6.0 及以上版本中,启用多线程 I/O 提升网络处理能力。
  • 分散计算逻辑:将复杂计算逻辑移到客户端或应用层,减少 Redis 的 CPU 负担。
  • 监控 CPU 使用率:定期监控 Redis 的 CPU 使用率,及时发现和解决 CPU 瓶颈。

持久化瓶颈

问题

  • Redis 提供了两种持久化方式:RDB(快照)和 AOF(追加日志)。
  • RDB 在生成快照时可能会占用大量 CPU 和内存,导致性能下降。
  • AOF 的日志追加操作会增加磁盘 I/O 压力,尤其是在高写入场景下。

解决方法

  • 选择合适的持久化方式:根据业务需求选择合适的持久化方式(如 RDB 适合备份,AOF 适合数据安全)。
  • 调整持久化配置:优化 RDB 和 AOF 的配置(如 save 参数、appendfsync 参数)以平衡性能和数据安全。
  • 使用混合持久化:在 Redis 4.0 及以上版本中,启用混合持久化(RDB + AOF)以兼顾性能和数据安全。
  • 监控持久化性能:定期监控 Redis 的持久化性能,及时发现和解决持久化瓶颈。

大key问题

大key定义:

  • 所谓的大key问题是某个key的value比较大,所以本质上是大value问题
  • String类型的Key,它的值为5MB(数据过大)
  • List类型的Key,它的列表数量为20000个(列表数量过多)
  • ZSet类型的Key,它的成员数量为10000个(成员数量过多)
  • Hash格式的Key,它的成员数量虽然只有1000个但这些成员的value总大小为100MB(成员体积过大)
  • 在实际业务中,大Key的判定仍然需要根据Redis的实际使用场景、业务场景来进行综合判断。通常都会以数据大小与成员数量来判定。
  • 一般认为string类型控制在10KB以内,hash、list、set、zset元素个数不要超过10000个。

大 Key 的问题

  • 内存占用过高:
    大 Key 会占用大量内存,可能导致 Redis 内存不足,触发内存淘汰策略(如 LRU、LFU),甚至导致 OOM(Out Of Memory)错误。
  • 网络以及操作性能下降:
    对大 Key 的操作(如 HGETALL、LRANGE、SMEMBERS)会消耗大量 CPU 和网络资源,导致 Redis 响应变慢。
  • 大 Key 的操作可能会阻塞 Redis 的单线程模型,影响其他命令的执行。
  • 持久化性能问题:
    在生成 RDB 快照或 AOF 日志时,大 Key 会导致持久化操作变慢,增加 Redis 的负载。
    数据迁移困难:
    在 Redis Cluster 中,大 Key 的数据迁移会占用大量网络带宽,影响集群的稳定性。
  • 故障恢复时间长:
    如果 Redis 实例发生故障,大 Key 的恢复时间会显著增加,影响服务的可用性。

大key的产生:

  • 大key的产生往往是业务方设计不合理,没有预见vaule的动态增长问题
  • redis数据结构使用不合理,易造成Key的value过大,如使用String类型的Key存放大体积二进制文件型数据
  • 业务上线前规划设计不足,没有对Key中的成员进行合理的拆分,造成个别Key中的成员数量过多
  • 没有对无效数据进行定期清理,造成如HASH类型Key中的成员持续不断的增加。即一直往value塞数据,却没有删除机制,value只会越来越大
  • 在实际业务中,可能会发生的大key场景:
  • 社交类:粉丝列表,如果某些明星或者大v不精心设计下,必是bigkey;
  • 统计类:例如按天存储某项功能或者网站的用户集合,除非没几个人用,否则必是bigkey;
  • 缓存类:将数据从数据库load出来序列化放到Redis里,这个方式非常常用,但有两个地方需要注意,第一,是不是有必要把所有字段都缓存,第二,有没有相关关联的数据。

优化方案

删除大key

  • 首先考虑删除大key,如果发现某些大key并非热key就可以在DB中查询使用,则可以在Redis中删掉:
  • Redis 4.0及之后版本:您可以通过UNLINK命令安全地删除大Key甚至特大Key,该命令能够以非阻塞的方式,逐步地清理传入的Key。 Redis UNLINK 命令类似与 DEL 命令,表示删除指定的 key,如果指定 key 不存在,命令则忽略。 UNLINK 命令不同与 DEL
    命令在于它是异步执行的,因此它不会阻塞。 UNLINK 命令是非阻塞删除,非阻塞删除简言之,就是将删除操作放到另外一个线程去处理。
  • Redis 4.0之前的版本:建议先通过SCAN命令读取部分数据,然后进行删除,避免一次性删除大量key导致Redis阻塞。 Redis Scan 命令用于迭代数据库中的数据库键。 SCAN 命令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标,
    用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数, 以此来延续之前的迭代过程。

压缩大key

  • 可以采用压缩法, 考虑到使用合适的序列化框架、压缩算法:
  • 当vaule是string时,比较难拆分,则使用序列化、压缩算法将key的大小控制在合理范围内,但是序列化和反序列化都会带来更多时间上的消耗, 如果压缩之后仍然是大key,则需要考虑进行拆分

拆分大key

  • 将一个Big Key拆分为多个key-value这样的小Key,并确保每个key的成员数量或者大小在合理范围内,然后再进行存储,通过get不同的key或者使用mget批量获取。
  • 当value是list/set等集合类型时,根据预估的数据规模来进行分片,不同的元素计算后分到不同的片

本地缓存(Caffeine )

  • 可以考虑本地缓存(Caffeine )》Redis》数据库

Case Study
某电商平台的商品评论数据存储在 Redis 中,使用列表(List)数据结构存储每个商品的评论 ID。由于某些热门商品的评论数量高达数百万条,导致这些商品的评论列表成为大 Key,引发以下问题:

  • 内存占用过高,导致 Redis 内存不足。
  • 获取评论列表(LRANGE)时,响应时间过长。
  • 持久化操作变慢,影响 Redis 的性能。

将每个商品的评论列表拆分为多个小列表

  • 例如:将商品 A 的评论列表拆分为 product:A:comments:1、product:A:comments:2、…、product:A:comments:N,每个小列表存储 1 万条评论。
  • 在客户端或应用层实现分页逻辑,按需获取评论列表
  • 将评论列表从列表(List)改为有序集合(ZSet),以支持按时间排序和分页查询

限制 Key 的大小:

  • 在写入评论时,检查评论列表的大小,如果超过阈值(如 1 万条),则创建新的小列表。

定期清理大 Key:

  • 使用 SCAN 命令定期扫描 Redis 中的大 Key,并进行清理或拆分。

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

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

相关文章

Python爬虫与代理IP:高效抓取数据的实战指南

目录 一、基础概念解析 1.1 爬虫的工作原理 1.2 代理IP的作用 二、环境搭建与工具选择 2.1 Python库准备 2.2 代理IP选择技巧 三、实战步骤分解 3.1 基础版:单线程免费代理 3.2 进阶版:多线程付费代理池 3.3 终极版:Scrapy框架自动…

Nginx HTTP 414 与“大面积”式洪水攻击联合防御实战

一、引言 在大规模分布式应用中,Nginx 常作为前端负载均衡和反向代理服务器。攻击者若结合超长 URI/头部攻击(触发 HTTP 414)与海量洪水攻击,可在网络层与应用层形成双重打击:一方面耗尽缓冲区和内存,另一…

【上位机——MFC】运行时类信息机制

运行时类信息机制的使用 类必须派生自CObject类内必须添加声明宏DECLARE_DYNAMIC(theClass)3.类外必须添加实现宏 IMPLEMENT_DYNAMIC(theClass,baseClass) 具备上述三个条件后&#xff0c;CObject::IsKindOf函数就可以正确判断对象是否属于某个类。 代码示例 #include <…

Maven插件管理的基本原理

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

卷积神经网络--手写数字识别

本文我们通过搭建卷积神经网络模型&#xff0c;实现手写数字识别。 pytorch中提供了手写数字的数据集 &#xff0c;我们可以直接从pytorch中下载 MNIST中包含70000张手写数字图像&#xff1a;60000张用于训练&#xff0c;10000张用于测试 图像是灰度的&#xff0c;28x28像素 …

大文件分片上传进阶版(新增md5校验、上传进度展示、并行控制,智能分片、加密上传、断点续传、自动重试),实现四位一体的网络感知型大文件传输系统‌

上篇文章我们总结了大文件分片上传的主要核心&#xff0c;但是我对md5校验和上传进度展示这块也比较感兴趣&#xff0c;所以在deepseek的帮助下&#xff0c;扩展了一下我们的代码&#xff0c;如果有任何问题和想法&#xff0c;非常欢迎大家在评论区与我交流&#xff0c;我需要学…

C# 点击导入,将需要的参数传递到弹窗的页面

点击导入按钮&#xff0c;获取本页面的datagridview标题的结构&#xff0c;并传递到导入界面。 新增一个datatable用于存储datagridview的caption和name&#xff0c;这里用的是devexpress组件中的gridview。 DataTable dt new DataTable(); DataColumn CAPTION …

android的 framework 是什么

Android的Framework&#xff08;框架&#xff09;是Android系统的核心组成部分&#xff0c;它为开发者提供了一系列的API&#xff08;应用程序编程接口&#xff09;&#xff0c;使得开发者能够方便地创建各种Android应用。以下是关于它的详细介绍&#xff1a; 位置与架构 在A…

【MySQL】表的约束(主键、唯一键、外键等约束类型详解)、表的设计

目录 1.数据库约束 1.1 约束类型 1.2 null约束 — not null 1.3 unique — 唯一约束 1.4 default — 设置默认值 1.5 primary key — 主键约束 自增主键 自增主键的局限性&#xff1a;经典面试问题&#xff08;进阶问题&#xff09; 1.6 foreign key — 外键约束 1.7…

数据结构-C语言版本(三)栈

数据结构中的栈&#xff1a;概念、操作与实战 第一部分 栈分类及常见形式 栈是一种遵循后进先出(LIFO, Last In First Out)原则的线性数据结构。栈主要有以下几种实现形式&#xff1a; 1. 数组实现的栈&#xff08;顺序栈&#xff09; #define MAX_SIZE 100typedef struct …

如何以特殊工艺攻克超薄电路板制造难题?

一、超薄PCB的行业定义与核心挑战 超薄PCB通常指厚度低于1.0毫米的电路板&#xff0c;而高端产品可进一步压缩至0.4毫米甚至0.2毫米以下。这类电路板因体积小、重量轻、热传导性能优异&#xff0c;被广泛应用于折叠屏手机、智能穿戴设备、医疗植入器械及新能源汽车等领域。然而…

AI 赋能 3D 创作!Tripo3D 全功能深度解析与实操教程

大家好&#xff0c;欢迎来到本期科技工具分享&#xff01; 今天要给大家带来一款革命性的 AI 3D 模型生成平台 ——Tripo3D。 无论你是游戏开发者、设计师&#xff0c;还是 3D 建模爱好者&#xff0c;只要想降低创作门槛、提升效率&#xff0c;这款工具都值得深入了解。 接下…

如何理解抽象且不易理解的华为云 API?

API的概念在华为云的使用中非常抽象&#xff0c;且不容易理解&#xff0c;用通俗的语言 形象的比喻来讲清楚——什么是华为云 API&#xff0c;怎么用&#xff0c;背后原理&#xff0c;以及主要元素有哪些&#xff0c;尽量让新手也能明白。 &#x1f9e0; 一句话先理解&#xf…

第 7 篇:总结与展望 - 时间序列学习的下一步

第 7 篇&#xff1a;总结与展望 - 时间序列学习的下一步 (图片来源: Guillaume Hankenne on Pexels) 恭喜你&#xff01;如果你一路跟随这个系列走到了这里&#xff0c;那么你已经成功地完成了时间序列分析的入门之旅。我们从零开始&#xff0c;一起探索了时间数据的基本概念、…

PPT无法编辑怎么办?原因及解决方法全解析

在日常办公中&#xff0c;我们经常会遇到需要编辑PPT的情况。然而&#xff0c;有时我们会发现PPT文件无法编辑&#xff0c;这可能由多种原因引起。今天我们来看看PPT无法编辑的几种常见原因&#xff0c;并提供实用的解决方法&#xff0c;帮助你轻松应对。 原因1&#xff1a;文…

前端面试题---GET跟POST的区别(Ajax)

GET 和 POST 是两种 HTTP 请求方式&#xff0c;它们在传输数据的方式和所需空间上有一些重要区别&#xff1a; ✅ 一句话概括&#xff1a; GET 数据放在 URL 中&#xff0c;受限较多&#xff1b;POST 数据放在请求体中&#xff0c;空间更大更安全。 &#x1f4e6; 1. 所需空间…

第 5 篇:初试牛刀 - 简单的预测方法

第 5 篇&#xff1a;初试牛刀 - 简单的预测方法 经过前面四篇的学习&#xff0c;我们已经具备了处理时间序列数据的基本功&#xff1a;加载、可视化、分解以及处理平稳性。现在&#xff0c;激动人心的时刻到来了——我们要开始尝试预测 (Forecasting) 未来&#xff01; 预测是…

从代码学习深度学习 - 学习率调度器 PyTorch 版

文章目录 前言一、理论背景二、代码解析2.1. 基本问题和环境设置2.2. 训练函数2.3. 无学习率调度器实验2.4. SquareRootScheduler 实验2.5. FactorScheduler 实验2.6. MultiFactorScheduler 实验2.7. CosineScheduler 实验2.8. 带预热的 CosineScheduler 实验三、结果对比与分析…

k8s 基础入门篇之开启 firewalld

前面在部署k8s时&#xff0c;都是直接关闭的防火墙。由于生产环境需要开启防火墙&#xff0c;只能放行一些特定的端口&#xff0c; 简单记录一下过程。 1. firewall 与 iptables 的关系 1.1 防火墙&#xff08;Firewall&#xff09; 定义&#xff1a; 防火墙是网络安全系统&…

RSS 2025|苏黎世提出「LLM-MPC混合架构」增强自动驾驶,推理速度提升10.5倍!

论文题目&#xff1a;Enhancing Autonomous Driving Systems with On-Board Deployed Large Language Models 论文作者&#xff1a;Nicolas Baumann&#xff0c;Cheng Hu&#xff0c;Paviththiren Sivasothilingam&#xff0c;Haotong Qin&#xff0c;Lei Xie&#xff0c;Miche…