Redis突然不收数据了,系统到底哪里出问题了,急需排查解决
- 问答
- 2026-01-05 18:00:40
- 17
别慌,Redis突然不接收数据了,这是个很常见但也很棘手的问题,咱们一步一步来,从最简单、最可能的地方开始查,就像医生看病一样,先量体温,再拍片子。
第一步:先看看Redis是不是还“活着”
最简单的,用redis-cli连上去,敲一个PING命令,如果Redis回复PONG,那至少说明服务进程还在,能响应,如果连不上或者没反应,那问题就大了,说明Redis服务可能已经挂掉了。
- 如果服务挂了:立刻去检查两点。
- 系统资源:是不是服务器内存爆了?用
free -h命令看看,Redis是内存数据库,如果物理内存耗尽,操作系统可能会把它“杀”掉,是不是CPU占用100%太久了?磁盘空间满了?尤其是Redis如果开启了持久化(AOF或RDB),磁盘满了也会导致它崩溃。 - Redis日志:这是最关键的线索!Redis的日志文件会告诉你它“临终”前发生了什么,日志路径在redis.conf配置文件里找
logfile这一项,常见死因有:内存不足被系统终止(OOM Killer)、持久化时出错、发生了段错误(Segmentation Fault)等,根据日志报错信息去搜索,基本能定位到根源。
- 系统资源:是不是服务器内存爆了?用
第二步:如果能连上,但写不进去数据
如果PING通了,但执行SET命令报错或者没反应,那就要深入看看了。
-
检查内存使用情况:这是最最最常见的原因!
- 在redis-cli里执行
info memory命令,重点看used_memory和maxmemory这两个值,如果used_memory已经非常接近甚至等于maxmemory,那就说明内存真的满了。 - Redis有一个叫
maxmemory-policy的配置,决定了内存满之后的策略,默认或常用的是noeviction(不淘汰),在这个策略下,当内存满了,所有会占用更多内存的写命令(比如SET,LPUSH等)都会被拒绝,而读命令不受影响,这就是为什么你感觉它“不收数据”但可能还能读数据的原因。 - 解决办法:要么清理掉一些不用的数据(比如用
FLUSHDB清空,但这是大招要慎用),要么增加maxmemory限制,要么修改maxmemory-policy为allkeys-lru之类的淘汰策略,让Redis自动淘汰旧数据来容纳新数据。
- 在redis-cli里执行
-
检查客户端连接数
- 在redis-cli里执行
info clients,看connected_clients这个数,再看看config get maxclients,这是Redis允许的最大连接数。 - 如果连接数已经达到上限,新的客户端就连不上了,自然也就没法写数据,这通常是因为应用程序里有连接泄漏,比如开了Redis连接忘了关,需要检查应用代码。
- 在redis-cli里执行
-
检查是否被“保护”起来了
- Redis有个配置叫
protected-mode,如果是为了简单没设密码,并且protected-mode是yes(默认值),那么当Redis只允许本地回环地址(127.0.0.1)访问,如果你的应用和Redis不在同一台服务器,从外网IP来连接,就会被拒绝,这时候要么设一个强密码,要么把客户端的IP加到bind配置里(不安全,不推荐)。
- Redis有个配置叫
-
检查是否有慢查询把服务器“卡”住了
- 虽然不常见,但如果有人执行了一个超级慢的命令(比如对一个大Key执行
KEYS *),或者同时有大量复杂命令,可能会暂时性地让Redis无法响应新的请求,在redis-cli里执行slowlog get 10,看看最近的慢查询日志,有没有可疑的操作。
- 虽然不常见,但如果有人执行了一个超级慢的命令(比如对一个大Key执行
-
检查持久化操作
- 如果Redis正在做持久化(生成RDB快照或重写AOF文件),这个过程会占用大量CPU和I/O资源,尤其是当数据量很大,而服务器性能又比较差的时候,可能会导致服务暂时无响应,查看
info persistence命令的输出,看rdb_bgsave_in_progress和aof_rewrite_in_progress是不是为1,如果是,说明正在后台执行持久化。
- 如果Redis正在做持久化(生成RDB快照或重写AOF文件),这个过程会占用大量CPU和I/O资源,尤其是当数据量很大,而服务器性能又比较差的时候,可能会导致服务暂时无响应,查看
-
网络问题
- 这看起来简单但容易被忽略,检查一下网络连接是否稳定,有没有防火墙规则突然阻止了到Redis端口的通信,可以用
telnet [RedisIP] [Redis端口]命令测试一下网络连通性。
- 这看起来简单但容易被忽略,检查一下网络连接是否稳定,有没有防火墙规则突然阻止了到Redis端口的通信,可以用
总结一下排查顺序:
- PING命令 -> 判断死活。
- 看日志 -> 如果死了,日志告诉你死因。
- info memory -> 如果活着,首要怀疑内存是否已满。
- info clients -> 检查连接数是否爆满。
- 检查配置(protected-mode, maxclients) -> 排除配置限制。
- slowlog/get 和 info persistence -> 检查是否有后台任务或慢查询造成暂时性卡顿。
- 检查网络 -> 最基础的连通性。
按照这个顺序,大部分“Redis突然不收数据”的问题都能被揪出来,Redis的info命令是你的最佳帮手,它提供了非常全面的运行时信息。

本文由太叔访天于2026-01-05发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://www.haoid.cn/wenda/75086.html
