Redis常见阻塞原因总结

devtools/2025/3/30 4:23:40/

Redis常见阻塞原因总结

Redis 可能出现阻塞的情况主要包括以下几种原因,并针对不同的场景提供优化方案:


1. 慢查询阻塞

原因
  • 执行耗时较长的命令,如 keys *hgetallsmembersflushall
  • 查询的数据量过大,导致单个命令执行时间过长。
  • CPU 资源占用过高,影响 Redis 的响应速度。
优化方案
  • 使用 SCAN 替代 KEYS,避免一次性扫描整个数据库
  • 使用 HSCANSSCANZSCAN 代替 HGETALLSMEMBERS 等大数据操作。
  • 优化数据结构,减少大 Key 的使用,改用分片存储。
  • 开启慢查询日志slowlog-log-slower-than 参数),排查耗时操作并优化。

2. 持久化(RDB/AOF)阻塞

原因
  • RDB 触发 BGSAVE 进程时,fork 进程占用大量 CPU 和内存。
  • AOF 追加模式下,AOF 文件过大,重写(BGREWRITEAOF)时影响性能。
  • AOF 同步写入 (appendfsync always) 可能导致 I/O 阻塞。
优化方案
  • 调整 RDB 触发策略

    ,避免频繁 fork 进程:

    • 适当延长 save 配置中的触发时间间隔。
    • 业务高峰期可临时关闭自动 RDB 触发,改为手动触发。
  • AOF 配置优化:

    • 使用 appendfsync everysec 代替 always,减少磁盘 I/O。
    • 定期 BGREWRITEAOF 避免 AOF 过大。
    • 业务高峰期避免 AOF 重写,改为低峰时段执行。

3. 内存不足导致 OOM(Out of Memory)

原因
  • 数据增长超出可用内存,Redis 进程可能被 OOM 终止。
  • 内存淘汰策略未配置,导致无法存入新数据。
优化方案
  • 设置 maxmemory 限制 Redis 的最大内存,避免超过物理机可用内存。
  • 选择合适的淘汰策略:
    • volatile-lru(淘汰最近最少使用的可过期 key)。
    • allkeys-lru(淘汰所有 key 中最近最少使用的)。
    • volatile-ttl(淘汰快过期的 key)。
    • noeviction(禁止淘汰,超出内存后返回错误)。
  • 使用数据压缩(如 zstdsnappy)减少大 key 占用的空间。
  • 定期清理无用数据,减少 Redis 负担。

4. 过多客户端连接

原因
  • 短连接频繁创建,导致 Redis 处理大量 TCP 连接,增加 CPU 开销。
  • maxclients 限制过低,导致新连接被拒绝。
优化方案
  • 使用连接池,如 JedisPool(Java)、hiredis(C)。
  • 提升 maxclients 配置,避免连接数过低导致客户端无法访问。
  • 开启 timeout 设置,自动关闭长时间未活跃的连接,减少资源占用。

5. 事务(MULTI/EXEC)阻塞

原因
  • 事务(MULTI + EXEC)中的命令过多,导致单个事务执行时间过长。
  • WATCH 监视的大 key 变更时,可能导致大量请求重试。
优化方案
  • 避免事务中包含 O(n) 复杂度的命令(如 LRANGEHGETALL)。
  • 拆分事务,减少每个事务的执行时间。
  • 避免大 key 监视,改用更细粒度的数据结构。

6. Lua 脚本执行阻塞

原因
  • Redis 单线程执行 Lua 脚本,长时间运行的脚本会阻塞其他请求。
  • EVAL 语句包含 O(n) 复杂度操作,影响整体性能。
优化方案
  • 使用 EVALSHA 复用已加载的 Lua 脚本,避免重复编译。
  • 限制 Lua 脚本的执行时间,可使用 redis-cli --intrinsic-latency 进行监测。
  • 复杂计算逻辑迁移到应用层,减少 Redis 计算压力。

7. 网络带宽/流量过高

原因
  • MONITOR 命令开启时,Redis 会记录所有请求,影响性能。
  • Redis 传输的数据量过大,可能导致带宽不足。
优化方案
  • 关闭 MONITOR,避免实时记录影响性能。

  • 启用 TCP_NODELAY,减少 TCP 延迟。

  • 使用 pipeline 进行批量请求,减少网络往返次数。

  • 优化数据结构

    ,减少大 key 的传输,例如:

    • 使用 HyperLogLog 代替 Set 进行基数统计。
    • Bitmaps 代替 List 进行状态记录。

总结

问题类型优化方案
慢查询使用 SCAN 代替 KEYS,优化数据结构
持久化调整 RDB 触发策略,优化 AOF 配置
内存不足配置 maxmemory,使用合适的淘汰策略
连接过多使用连接池,提高 maxclients
事务阻塞拆分事务,避免大 key 监视
Lua 阻塞限制脚本执行时间,优化计算逻辑
网络流量关闭 MONITOR,使用 pipeline

通过这些优化手段,可以有效减少 Redis 阻塞,提高系统性能和稳定性。


http://www.ppmy.cn/devtools/171472.html

相关文章

HTML5 初探:新特性与本地存储的魔法

HTML5 初探:新特性与本地存储的魔法 作为一名前端新手,你可能听说过 HTML5 这个名词。它是 HTML 的第五代版本,不仅让网页变得更强大,还带来了许多新功能和工具。今天,我们就来聊聊 HTML5 的新特性,以及它…

Kotlin中 StateFlow 或 SharedFlow 的区别

StateFlow 和 SharedFlow 是 Kotlin 协程(Coroutines) 提供的两种 响应式数据流(Reactive Streams),用于在应用程序中处理异步数据流,类似于 RxJava 的 Observable 或 Flowable,但更轻量且与 Ko…

基于 arco 的 React 和 Vue 设计系统

arco 是字节跳动出品的企业级设计系统,支持React 和 Vue。 安装模板工具 npm i -g arco-cli创建项目目录 cd someDir arco init hello-arco-pro? 请选择你希望使用的技术栈React❯ Vue? 请选择一个分类业务组件组件库Lerna Menorepo 项目❯ Arco Pro 项目看到以…

【春招笔试】阿里云2025.03.20

春秋招笔试合集🔗 题目一:字符串偏好识别系统 1️⃣:预处理参考字符串中所有长度为k的子串,存入哈希集合 2️⃣:对每个查询字符串,检查其前k个字符和后k个字符是否在哈希集合中 难度:中等偏简单 这道题目考察字符串处理和前缀/后缀分析能力。通过预处理技术和对查询字…

Spring BeanFactoryPostProcessor 和 BeanPostProcessor有什么用?

BeanFactoryPostProcessor 和 BeanPostProcessor 都是 Spring 框架中非常重要的扩展点,我们在开发中可以利用 Spring 容器实例化 Bean、配置 Bean 以及初始化 Bean 的过程中进行自定义的干预。但它们的作用时机和作用对象不同。 1. BeanFactoryPostProcessor: 作用…

推荐1款简洁、小巧的实用收音机软件,支持手机和电脑

聊一聊 没想到现在还有人喜欢听广播。 我一直以为听广播必须要用那种小广播机才可以。 原来手机或电脑上也是可以的。 今天给大家分享一款可以在电脑和手机上听广播的软件。 软件介绍 龙卷风收音机 电台广播收音机分电脑和手机两个版本。 电脑端无需安装,下载…

netplan是如何操控systemd-networkd的? 笔记250324

netplan是如何操控systemd-networkd的? netplan通过以下方式操控systemd-networkd: 工作原理:netplan读取位于/etc/netplan/目录下的YAML格式的配置文件,这些配置文件描述了网络接口的配置。netplan会将这些配置文件解析并转换为systemd-ne…

多语言语料库万卷·丝路2.0开源,数据模态全面升级,搭建文化交流互鉴AI桥梁

3月22日,上海人工智能实验室(上海AI实验室)联合新华社新闻信息中心、上海外国语大学、外研在线等,发布全新升级的“万卷丝路2.0”多语言语料库,通过构建多语言开源数据底座,以人工智能赋能“一带一路”高质…