当前位置:首页 > 问答 > 正文

Redis突然不收数据了,系统到底哪里出问题了,急需排查解决

别慌,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命令报错或者没反应,那就要深入看看了。

  1. 检查内存使用情况:这是最最最常见的原因!

    • 在redis-cli里执行info memory命令,重点看used_memorymaxmemory这两个值,如果used_memory已经非常接近甚至等于maxmemory,那就说明内存真的满了。
    • Redis有一个叫maxmemory-policy的配置,决定了内存满之后的策略,默认或常用的是noeviction(不淘汰),在这个策略下,当内存满了,所有会占用更多内存的写命令(比如SET, LPUSH等)都会被拒绝,而读命令不受影响,这就是为什么你感觉它“不收数据”但可能还能读数据的原因。
    • 解决办法:要么清理掉一些不用的数据(比如用FLUSHDB清空,但这是大招要慎用),要么增加maxmemory限制,要么修改maxmemory-policyallkeys-lru之类的淘汰策略,让Redis自动淘汰旧数据来容纳新数据。
  2. 检查客户端连接数

    • 在redis-cli里执行info clients,看connected_clients这个数,再看看config get maxclients,这是Redis允许的最大连接数。
    • 如果连接数已经达到上限,新的客户端就连不上了,自然也就没法写数据,这通常是因为应用程序里有连接泄漏,比如开了Redis连接忘了关,需要检查应用代码。
  3. 检查是否被“保护”起来了

    • Redis有个配置叫protected-mode,如果是为了简单没设密码,并且protected-modeyes(默认值),那么当Redis只允许本地回环地址(127.0.0.1)访问,如果你的应用和Redis不在同一台服务器,从外网IP来连接,就会被拒绝,这时候要么设一个强密码,要么把客户端的IP加到bind配置里(不安全,不推荐)。
  4. 检查是否有慢查询把服务器“卡”住了

    • 虽然不常见,但如果有人执行了一个超级慢的命令(比如对一个大Key执行KEYS *),或者同时有大量复杂命令,可能会暂时性地让Redis无法响应新的请求,在redis-cli里执行slowlog get 10,看看最近的慢查询日志,有没有可疑的操作。
  5. 检查持久化操作

    • 如果Redis正在做持久化(生成RDB快照或重写AOF文件),这个过程会占用大量CPU和I/O资源,尤其是当数据量很大,而服务器性能又比较差的时候,可能会导致服务暂时无响应,查看info persistence命令的输出,看rdb_bgsave_in_progressaof_rewrite_in_progress是不是为1,如果是,说明正在后台执行持久化。
  6. 网络问题

    • 这看起来简单但容易被忽略,检查一下网络连接是否稳定,有没有防火墙规则突然阻止了到Redis端口的通信,可以用telnet [RedisIP] [Redis端口]命令测试一下网络连通性。

总结一下排查顺序:

  1. PING命令 -> 判断死活。
  2. 看日志 -> 如果死了,日志告诉你死因。
  3. info memory -> 如果活着,首要怀疑内存是否已满。
  4. info clients -> 检查连接数是否爆满。
  5. 检查配置(protected-mode, maxclients) -> 排除配置限制。
  6. slowlog/getinfo persistence -> 检查是否有后台任务或慢查询造成暂时性卡顿。
  7. 检查网络 -> 最基础的连通性。

按照这个顺序,大部分“Redis突然不收数据”的问题都能被揪出来,Redis的info命令是你的最佳帮手,它提供了非常全面的运行时信息。

Redis突然不收数据了,系统到底哪里出问题了,急需排查解决