Redis哪些耗时命令拖慢性能?怎么排查和优化?

文章导读
Redis 性能变慢通常由高复杂度命令、大 Key 操作、内存交换及网络延迟引起。排查时首先应开启慢日志(slowlog),设定阈值捕获耗时命令,重点关注 O(n) 复杂度指令如 keys*、sort 等。优化方案包括避免使用高风险命令、拆分大 Key、控制单次操作数据量。此外,需检查服务器内存使用率防止 swap 交换,并排查业务服务器到 Redis 之间的网络链路质量,通过链路追踪定位延迟环节
📋 目录
  1. Redis 变慢了,你会怎么排查
  2. 为什么我的 Redis 这么“慢”?
  3. Redis 为什么变慢了?一文讲透如何排查 Redis 性能问题 | 万字长文
  4. 关于 redis 性能问题分析和优化,看这篇就够了
  5. FAQ
A A

Redis 性能变慢通常由高复杂度命令、大 Key 操作、内存交换及网络延迟引起。排查时首先应开启慢日志(slowlog),设定阈值捕获耗时命令,重点关注 O(n) 复杂度指令如 keys*、sort 等。优化方案包括避免使用高风险命令、拆分大 Key、控制单次操作数据量。此外,需检查服务器内存使用率防止 swap 交换,并排查业务服务器到 Redis 之间的网络链路质量,通过链路追踪定位延迟环节,确保网络无丢包且延迟在正常范围内,必要时升级硬件或优化架构。

Redis 变慢了,你会怎么排查

Redis 变慢了,你会怎么排查\n首先,第一步,建议你去查看一下 Redis 的慢日志。Redis 提供了慢日志命令的统计功能,我们通过以下设置,就可以查看有哪些命令在执行时延迟比较大。首先设置 Redis 的慢日志阈值,只有超过阈值的命令才会被记录,这里的单位是微妙,例如设置慢日志的阈值为 5 毫秒,同时设置只保留最近 1000 条慢日志记录:代码语言:javascript AI 代码解释 # 命令执行超过 5 毫秒记录慢日志 CONFIGSETslowlog-log-slower-than5000# 只保留最近 1000 条慢日志 CONFIGSETslowlog-max-len1000 复制代码 设置完成之后,所有执行的命令如果延迟大于 5 毫秒,都会被 Redis 记录下来,我们执行 SLOWLOG get 5 查询最近 5 条慢日志:代码语言:javascript AI 代码解释 127.0.0.1:6379>SLOWLOGget51)1)(integer)32693# 慢日志 ID2)(integer)1593763337# 执行时间 3)(integer)5299#执行耗时 (微妙)4)1)"LRANGE"# 具体执行的命令和参数 2)"user_list_2000"3)"0"4)"-1"2)1)(integer)326922)(integer)15937633373)(integer)50444)1)"GET"2)"book_price_1000" 复制代码 通过查看慢日志记录,我们就可以知道在什么时间执行哪些命令比较耗时,如果你的业务经常使用****O(n) 以上复杂度的命令,例如 sort、sunion、zunionstore,或者在执行 O(n) 命令时操作的数据量比较大,这些情况下 Redis 处理数据时就会很耗时。如果你的服务请求量并不大,但 Redis 实例的 CPU 使用率很高,很有可能是使用了复杂度高的命令导致的。解决方案就是,不使用这些复杂度较高的命令,并且一次不要获取太多的数据,每次尽量操作少量的数据,让 Redis 可以及时处理返回。存储大 key 如果查询慢日志发现,并不是复杂度较高的命令导致的,例如都是 SET、DELETE 操作出现在慢日志记录中,那么你就要怀疑是否存在 Redis 写入了大 key 的情况。(资料日期为 2026 年 4 月 3 日)

为什么我的 Redis 这么“慢”?

为什么我的 Redis 这么“慢”?\n首先,第一步,建议你去查看一下 Redis 的慢日志。Redis 提供了慢日志命令的统计功能,我们通过以下设置,就可以查看有哪些命令在执行时延迟比较大。首先设置 Redis 的慢日志阈值,只有超过阈值的命令才会被记录,这里的单位是微秒。例如设置慢日志的阈值为 5 毫秒,同时设置只保留最近 1000 条慢日志记录:代码语言:javascript AI 代码解释 # 命令执行超过 5 毫秒记录慢日志 CONFIGSETslowlog-log-slower-than5000# 只保留最近 1000 条慢日志 CONFIGSETslowlog-max-len1000 设置完成之后,所有执行的命令如果延迟大于 5 毫秒,都会被 Redis 记录下来,我们执行 SLOWLOG get 5 查询最近 5 条慢日志:代码语言:javascript AI 代码解释 127.0.0.1:6379>SLOWLOGget51)1)(integer)32693# 慢日志 ID2)(integer)1593763337# 执行时间 3)(integer)5299#执行耗时 (微妙)4)1)"LRANGE"# 具体执行的命令和参数 2)"user_list_2000"3)"0"4)"-1"2)1)(integer)326922)(integer)15937633373)(integer)50444)1)"GET"2)"book_price_1000" 通过查看慢日志记录,我们就可以知道在什么时间执行哪些命令比较耗时,如果你的业务经常使用 O(n) 以上复杂度的命令。例如 sort、sunion、zunionstore,或者在执行 O(n) 命令时操作的数据量比较大,这些情况下 Redis 处理数据时就会很耗时。如果你的服务请求量并不大,但 Redis 实例的 CPU 使用率很高,很有可能是使用了复杂度高的命令导致的。解决方案就是,不使用这些复杂度较高的命令,并且一次不要获取太多的数据,每次尽量操作少量的数据,让 Redis 可以及时处理返回。存储大 Key 如果查询慢日志发现,并不是复杂度较高的命令导致的,例如都是 SET、DELETE 操作出现在慢日志记录中,那么你就要怀疑是否存在 Redis 写入了大 Key 的情况。Redis 在写入数据时,需要为新的数据分配内存,当从 Redis 中删除数据时,它会释放对应的内存空间。如果一个 Key 写入的数据非常大,Redis 在分配内存时也会比较耗时。(消息于 2026 年 4 月 11 日发布)

Redis 为什么变慢了?一文讲透如何排查 Redis 性能问题 | 万字长文

Redis 为什么变慢了?一文讲透如何排查 Redis 性能问题 | 万字长文\n为什么 Redis 执行 SET、DEL 命令耗时也很久?如果你发现你的业务服务 API 响应延迟变长,首先你需要先排查服务内部,究竟是哪个环节拖慢了整个服务。比较高效的做法是,在服务内部集成链路追踪,也就是在服务访问外部依赖的出入口,记录下每次请求外部依赖的响应延时。如果你发现确实是操作 Redis 的这条链路耗时变长了,那么此刻你需要把焦点关注在业务服务到 Redis 这条链路上。业务服务器到 Redis 服务器之间的网络存在问题,例如网络线路质量不佳,网络数据包在传输时存在延迟、丢包等情况 通常来说,第一种情况发生的概率比较小,如果是服务器之间网络存在问题,那部署在这台业务服务器上的所有服务都会发生网络延迟的情况,此时你需要联系网络运维同事,让其协助解决网络问题。也就是从 Redis 角度来排查,是否存在导致变慢的场景,以及都有哪些因素会导致 Redis 的延迟增加,然后针对性地进行优化。(撰于 2023 年 7 月 3 日)

Redis哪些耗时命令拖慢性能?怎么排查和优化?

关于 redis 性能问题分析和优化,看这篇就够了

关于 redis 性能问题分析和优化,看这篇就够了\nserver,clients,memory,persistence,stats,replication,cpu,commandstats,cluster,keyspace 为了快速定位并解决性能问题,这里选择 5 个关键性的数据指标,它包含了大多数人在使用 Redis 上会经常碰到的性能问题其中 used_memory_human 和 used_memory 是一样的,以 G 为单位显示 mem_allocator:在编译时指定的 Redis 使用的内存分配器,可以是 libc、jemalloc、tcmalloc。通过查看 used_memory 指标可知道 Redis 正在使用的内存情况,如果 used_memory>可用最大内存,那就说明 Redis 实例正在进行内存交换或者已经内存交换完毕。因为当 Redis 内存使用率超过可用内存的 95% 时,部分数据开始在内存与 swap 空间来回交换,这时就可能有丢失数据的危险。(来自 2026 年 4 月 11 日的资料)

FAQ

Redis 慢日志如何设置?

使用 CONFIG SET slowlog-log-slower-than 设置微秒阈值。

哪些命令属于高复杂度命令?

Redis哪些耗时命令拖慢性能?怎么排查和优化?

如 keys*, sort, sunion, zunionstore 等 O(n) 命令。

内存交换对 Redis 有什么影响?

会导致数据在内存与 swap 空间交换,极大增加延迟甚至丢失数据。