Redis 的性能问题通常源于配置不当、数据结构误用、资源瓶颈或架构缺陷。以下是 Redis 常见的性能问题及优化方案,结合线上经验整理:


🧠 ​一、内存相关问题

1. 内存不足(OOM)​
  • 现象​:OOM errors、响应超时、节点崩溃。
  • 原因​:
    • 数据量超过 maxmemory 限制。
    • 未设置合理淘汰策略(如 allkeys-lru)。
  • 解决​:
    • 监控内存使用(INFO memory),预留 20%~30% 缓冲。
    • 设置 maxmemory-policy(推荐 volatile-lruallkeys-lru)。
    • 拆分大 Key(见下文),开启内存碎片整理(activedefrag yes)。
2. 内存碎片过高
  • 现象​:mem_fragmentation_ratio > 1.5INFO memory 查看),内存浪费严重。
  • 原因​:频繁修改、删除 Key(如 List 元素 pop/push)。
  • 解决​:
    • 开启碎片整理:activedefrag yes + 调整 active-defrag-* 参数。
    • 升级 Redis 6.2+(优化 jemalloc 碎片管理)。
    • 避免频繁删除大 Key,重启节点释放碎片(谨慎操作)。

⚡ ​二、CPU 与延迟问题

1. CPU 跑满(100%)​
  • 现象​:响应延迟飙升,slowlog 大量记录。
  • 原因​:
    • 复杂命令​:KEYS *FLUSHALL、大数据集 SINTER/ZUNIONSTORE
    • 过期 Key 集中清理​(active-expire-cycle 占用)。
    • RDB/AOF 持久化​:bgsaverewriteaof 时 fork 阻塞。
  • 解决​:
    • 禁用高危命令​:rename-command KEYS ""
    • 避免单 Key 过大(拆分集合类型)。
    • 调整持久化策略:AOF 改为 everysec,减少 RDB 频率。
    • 升级 SSD 磁盘(降低 fork 阻塞时间)。
2. 慢查询(Slow Query)​
  • 现象​:SLOWLOG get 记录大量 >10ms 操作。
  • 原因​:
    • 大 Key 操作​:获取 10MB 的 String,遍历 100 万成员的 Set。
    • 不合理管道​:PIPELINE 内堆积过多命令阻塞响应。
  • 解决​:
    • 所有操作时间复杂度必须为 O(1) 或 O(logN)​
    • 禁止 HGETALLSMEMBERS → 用 HSCAN/SSCAN 分批次获取。
    • 控制 Pipeline 命令数量(一般不超过 100/次)。
    • 使用 redis-cli --latency 检测网络延迟问题。

📦 ​三、数据模型问题

1. 大 Key(Big Key)​
  • 定义​:
    • String 类型 > 10 KB
    • 集合类型(Hash/List/Set/ZSet)元素 > 5,000
  • 风险​:阻塞网络、内存溢出、持久化超时。
  • 排查​:redis-cli --bigkeys(生产慎用,改用离线分析工具)。
  • 优化​:
    • 拆分 Key​:Hash → user:{id}:profile_base + user:{id}:profile_detail
    • 压缩​:gzip 压缩 String 值(需权衡 CPU)。
    • 分片读取​:ZRANGEBYSCOREZSCAN 分批操作。
2. 热 Key(Hot Key)​
  • 现象​:单 Key QPS > 5,000,节点流量不均。
  • 解决​:
    • 客户端缓存​:Redis 6.0+ Client-side Caching(CLIENT TRACKING)。
    • 读分离​:增加副本节点分担读压力。
    • 本地缓存​:在应用层用 Caffeine 或 Guava Cache 挡一层。
    • 分片存储​:将 Key 复制多份(如 hot_key_v1, hot_key_v2),轮询访问。

📡 ​四、网络与连接问题

1. 连接数耗尽
  • 现象​:ERR max number of clients reached,新连接失败。
  • 原因​:
    • maxclients 设置过低(默认 10,000)。
    • 客户端未释放连接(如连接池泄漏)。
  • 解决​:
    • 调高 maxclients(需考虑系统句柄数限制)。
    • 使用连接池(如 Lettuce、Jedis),检查泄漏(CLIENT LIST 看 idle 时间)。
2. 网络拥堵
  • 现象​:throughput 下降,延迟抖动。
  • 原因​:
    • 单节点流量超过网卡上限(如 10 Gbps)。
    • 跨机房访问(网络延迟增加)。
  • 解决​:
    • 分片集群:增加节点分摊流量。
    • 同机房部署:避免跨 AZ 访问。
    • 升级网络:万兆网卡或 RDMA。

💾 ​五、持久化问题

1. AOF 阻塞写入
  • 现象​:aof_delayed_fsync 计数上升,主线程阻塞。
  • 原因​:appendfsync always 每次写入同步磁盘(性能极差)。
  • 解决​:改为 appendfsync everysec(平衡性能与安全)。
2. RDB fork 超时
  • 现象​:bgsave 时主线程卡顿数秒。
  • 原因​:数据集大 + 磁盘慢,fork() 耗时过长。
  • 优化​:
    • 使用 SSD 磁盘。
    • 控制 save 频率(如从 save 60 10000 调整为 save 300 1000)。
    • 关闭透明大页(THP):echo never > /sys/kernel/mm/transparent_hugepage/enabled

⚙️ ​六、集群与高可用问题

1. 数据倾斜
  • 表现​:部分节点内存/CPU 使用率远超其他节点。
  • 解决​:
    • 均匀分片​:避免使用单一 hash tag(如 {user123})。
    • 扩容集群:增加分片数。
    • 手动迁移 Slot(CLUSTER SETSLOT + MIGRATE)。
2. 脑裂(Split-Brain)​
  • 现象​:主从切换后数据丢失。
  • 预防​:
    • 设置 min-slaves-to-write 1(至少 1 个从节点同步才可写)。
    • 合理配置 cluster-node-timeout(默认 15s,避免过早切换)。

🔍 ​诊断工具速查表

工具/命令用途
INFO memory检查内存使用与碎片率
SLOWLOG get抓取慢查询命令
redis-cli --bigkeys扫描大 Key(慎用线上)
redis-cli --hotkeys探测热 Key(需开启 LFU)
MONITOR实时抓取命令(仅调试,影响性能)
RedisInsight官方可视化监控(内存/命令/集群)
Prometheus+Grafana构建实时监控大盘

✅ ​性能优化总结

  1. 内存​:防 OOM + 控碎片 + 拆大 Key
  2. CPU​:避免复杂命令 + 优化持久化策略
  3. 数据模型​:禁止遍历操作 + 读写分离拆热 Key
  4. 网络​:连接池管理 + 集群分片均匀
  5. 持久化​:everysec 代替 always,SSD 减少 fork 阻塞
  6. 集群​:防倾斜 + 防脑裂 + 定期扩缩容

关键原则​:​所有命令必须 O(1) 时间复杂度,网络往返次数比数据大小更影响性能!​

建议结合 监控指标 + 慢日志 定位瓶颈,优先解决大 Key、热 Key 和持久化阻塞问题。遇到高并发场景,本地缓存 + 读写分离是性价比最高的方案。

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

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

相关文章

Blender 基础操作

基础操作 一、视角控制 ①旋转视角 : 拖动鼠标中键 ②平移视角 : shift 鼠标中键 ③放大\缩小 :鼠标滚轮 二、物体控制 1、重要 ① 移动物体 : G ② 旋转物体 : R ③ 缩放物体 : S 2、不重要 ④ 新建物体 : shift A ⑤ 复制物体 : shift D…

Go 语言三大核心数据结构深度解析:数组、切片(Slice)与映射(Map)

🚀Go 语言三大核心数据结构深度解析:数组、切片(Slice)与映射(Map) 在 Go 语言的开发领域,数组、切片与映射 这三大核心数据结构犹如构建程序的基石,支撑着各类数据的存储与处理。它…

《Webpack与Vite热模块替换机制深度剖析与策略抉择》

从早期简单的文件合并工具,到如今功能强大、高度自动化的Webpack和Vite,它们重塑了前端开发的流程与效率。而热模块替换(HMR, Hot Module Replacement)机制,作为其中关键的一环,更是成为开发者提升开发体验、加速项目迭代的秘密武器。Webpack,作为前端构建领域的先驱者,…

虚拟乐队“天鹅绒落日”:AI生成音乐引发的行业风暴

引言近日,音乐行业掀起了一阵关于一支名为“The Velvet Sundown”(天鹅绒落日)乐队的新闻热潮。原因何在?这支乐队很可能并非真正的乐队,其音乐也或许是由人工智能生成的。事实上,越来越多的共识认为&#…

c++ final override 关键字

1.finalfinal 防止子类继承,用于类或虚函数,限制继承或重写class Base final {}; // Base类不能被继承class Base { public:virtual void foo() final; // 禁止子类重写foo() };2.overrideoverride 子类中重写父类中函数,,仅用于…

剑桥大学最新研究:基于大语言模型(LLM)的分子动力学模拟框架,是MD的GPT时刻还是概念包装?

近期,剑桥大学 Michele Vendruscolo 团队在预印本平台上发布了一项最新研究,提出了一个名为 MD-LLM 的框架,旨在为高效研究蛋白质动态提供一种全新的思路。简单来说,他们希望借助大语言模型(LLM)&#xff0…

MySQL梳理:其他

MySQL数据库技术知识合集,涵盖InnoDB存储引擎的区管理机制、缓冲池机制等核心技术要点。本文档将持续补充MySQL相关的重要技术知识点。 📋 目录 模块一:InnoDB区状态管理机制 1.1 核心设计思想1.2 四种区状态详解1.3 渐进式空间分配策略1.4…

影刀 —— 飞书电子表格

以获取列上第一个可用行为例我们需要获取的分别是 凭证 和 表格唯一标识首先来看如何获取凭证在飞书开发者后台创建应用然后添加权限发版拿App ID 和 App Secret下面来创建电子表格!!!注意这个表格一定不要创建到知识库里面如果创建到知识库里…

1.二维图像处理(完整版)

目录 1.变换矩阵 2.在矩阵的基础上添加各种变换形式 3.开始变换 4.计算变换矩阵参数 新算子 二、阈值分割 新算子 三、blob分析案例 1.焊点 2.石头 3.木材 4.车牌 5.骰子 新算子 四、傅里叶变换频域分析 问题一 五、滤波处理 1.均值滤波 2.中值滤波 3.高斯…

【linux基础】Linux 文本处理核心命令指南

Linux 文本处理核心命令指南 文本处理是 Linux 系统管理的核心能力,约 80% 的配置文件操作都依赖于文本处理技术。本指南详细讲解 echo、重定向、cat、grep、wc 和 vim 等关键命令,涵盖从基础操作到高级技巧的完整知识体系,并配有实用案例演示…

基于深度学习YOLOv12的草莓成熟度检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)https://www.bilibili.com/video/BV1

一、项目介绍 本项目构建了一套基于深度学习 YOLOv12 的草莓成熟度识别检测系统,旨在实现对草莓在不同成熟阶段的高精度、实时检测与分类。系统采用 YOLO 格式数据集,将草莓分为 3 个类别:生(raw)、半熟(tu…

深入理解Android Kotlin Flow:响应式编程的现代实践

引言在现代Android开发中,处理异步数据流是一个核心需求。Kotlin Flow作为协程库的一部分,提供了一种声明式的、可组合的异步数据流处理方式。本文将深入探讨Flow的设计理念、核心组件、高级用法以及在实际项目中的最佳实践。一、Flow基础概念1.1 什么是…

功能测试详解

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试项目启动与研读需求文档(一) 组建测试团队1、测试团队中的角色2、测试团队的基本责任尽早地发现软件程序、系统或产品中所有的问题…

算法73. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法。 示例 1:输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]] 示例2: 输入&#xf…

【力扣22】括号生成

数字n代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且有效的括号组合。 源代码&#xff1a; class Solution { public:int n;vector<string> ans;string path;vector<string> generateParenthesis(int n) {this->n n;d…

ELK分布式日志采集系统

* 系统架构&#xff1a;filebeat 采集各服务器日志&#xff1b;Logstash-docker 过滤整理日志&#xff1b; Elasticsearch-docker 存储和索引数据&#xff1b; Kibana-docker 提供可视化展示和操作。* FileBeat简介&#xff1a;Filebeat是本地文件的日志数据采集器。* Kafka简介…

Python生产环境部署指南:专业级应用启动方案

在生产环境中部署Python应用需要考虑稳定性、性能和安全性。本文将详细介绍多种专业部署方案,助你构建可靠的生产环境。 一、核心部署架构 标准Python生产环境包含三个核心组件: 应用服务器:运行Python代码(Gunicorn/uWSGI/Uvicorn) 进程管理器:保障服务持续运行(Supe…

C语言:结构体、共用体与枚举详解

在 C 语言编程中&#xff0c;结构体&#xff08;struct&#xff09;、共用体&#xff08;union&#xff09;与枚举&#xff08;enum&#xff09;是三种非常重要的用户自定义数据类型。它们能帮助我们更好地组织、管理和表达复杂的数据结构。本文将结合实例&#xff0c;深入介绍…

Linux Web服务器与WordPress部署笔记

web服务器 nginx 配置基本认证 用户名和密码使用plain text发送&#xff0c;所以最好配置SSL/TLS。 # 安装工具[rootserver ~ 09:21:43]# yum -y install httpd-tools[rootserver ~ 09:28:30]# vim /etc/nginx/conf.d/ssl.confserver {​location /auth-basic/ {auth_basic …

贪心----3. 跳跃游戏 II

45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; /** 维护变量: max_reachable,遍历过的元素的最远可达位置 end,当前区间终点(随max_reachable变化) 遍历过程: 遍历时迭代遍历过的元素最远可达位置,利用end记录当前区间终点(随max_reachable变化) 当移动至end即当前…