Redis用着出错了怎么办?这些常见问题和解决办法你得知道
- 问答
- 2026-01-06 15:37:55
- 9
连接不上Redis,报超时或拒绝连接
这是最常遇到的问题之一,当你应用程序日志里看到类似“Connection refused”、“Connection timed out”的错误时,别慌,按以下步骤排查。
- 检查Redis服务是否启动:这是最基本的一步,去你的服务器上,用
ps -ef | grep redis命令看看Redis进程在不在,如果没找到,说明服务没起来,需要你去启动它,命令通常是redis-server /path/to/your/redis.conf。 - 检查防火墙和端口:Redis默认运行在6379端口,有时候不是Redis的问题,而是服务器的防火墙拦住了,检查一下防火墙规则,确保6379端口是放行的,比如在CentOS 7以上,可以用
firewall-cmd --list-all查看,如果需要放行,用firewall-cmd --add-port=6379/tcp --permanent然后重启防火墙。 - 检查Redis配置:Redis的配置文件(redis.conf)里有两个关键设置:
bind:这个配置项决定了Redis监听哪个IP地址,如果被注释掉或者设置为bind 0.0.0.0,那么它会接受所有网络接口的连接,但如果只设置了bind 127.0.0.1,那就只有本机才能连上,如果你从其他机器连接,就需要修改这个配置。protected-mode:这个是安全模式,如果Redis没有设置密码(requirepass),bind没有明确指定IP(比如还是默认的127.0.0.1),那么为了保护数据,安全模式会开启,阻止外网连接,解决办法要么是设置密码,要么是正确配置bind并信任你的网络环境。
- 检查网络本身:如果服务在远程,用
telnet your_redis_ip 6379命令测试一下网络通不通,如果连不上,可能是网络路由、安全组(云服务器)等问题。
内存爆了,提示OOM(内存不足)
Redis是内存数据库,所有数据都放在内存里,当内存用完时,就会触发OOM,Redis会根据配置的 maxmemory-policy(内存淘汰策略)来决定怎么办。
- 查看当前内存使用:用
redis-cli连接上,执行info memory命令,重点关注used_memory和maxmemory这两个值。 - 设置合理的内存大小和淘汰策略:在redis.conf中,通过
maxmemory设置Redis可使用的最大内存,更重要的是maxmemory-policy:volatile-lru:只从设置了过期时间的键中,淘汰最近最少使用的。allkeys-lru:从所有键中淘汰最近最少使用的,这是最常用的策略。volatile-ttl:淘汰即将过期的键。noeviction:不淘汰,当内存不足时,新写入操作会报错,这是默认策略,生产环境一般不建议用。- 根据你的业务特点选择合适的策略,如果你的数据都可以淘汰,就用
allkeys-lru;如果有些关键数据不能丢,而有些缓存数据可以丢,就给关键数据不设过期时间,然后使用volatile-lru。
- 排查内存突然增长的原因:有时候内存暴涨可能是出现了大Key(下面会讲)或者有恶意的批量操作,可以看看慢查询日志,或者用
redis-cli --bigkeys命令(生产环境慎用,可能卡顿)来找出特别大的键。
响应变慢,延迟很高
感觉Redis变“卡”了,请求要等很久才有回应。
- 使用慢查询日志:Redis可以记录执行时间超过指定阈值的命令,在redis.conf中设置
slowlog-log-slower-than(单位微秒,10000就是10毫秒),然后通过slowlog get命令查看慢查询,你可能会发现一些意想不到的“慢”命令,keys *。 - *绝对避免使用 `keys
命令**:这个命令会阻塞Redis,遍历所有键,如果键数量巨大,会导致服务瞬间不可用,替代方案是使用scan` 命令,它是非阻塞的、渐进式的遍历。 - 警惕大Key(Big Key):如果一个Key对应的Value非常大(比如一个List包含百万级元素,一个String有几百KB),在序列化/反序列化、网络传输时都会很耗时,删除它也可能导致阻塞,解决办法是拆分大Key,比如把一个大List拆成多个小的List。
- 检查持久化操作:如果使用了RDB持久化,在生成快照(fork子进程)时,如果内存数据量大,fork过程可能会阻塞主线程,AOF持久化在每次写命令时刷盘(appendfsync always)模式也会影响性能,通常建议使用
appendfsync everysec折中。 - 系统层面问题:操作系统内存不足导致Swap,CPU竞争激烈,网络带宽打满等,都会让Redis表现不佳,需要监控服务器整体资源使用情况。
数据不见了
存进去的数据,过一会儿就没了。
- 检查过期时间(TTL):这是最常见的原因,你可能在设置键的时候加了过期时间但自己忘了,用
ttl your_key命令可以查看这个键还剩多少秒过期,如果是-2,就表示键不存在;如果是-1,表示永不过期。 - 检查内存淘汰:如上所述,当内存不足且配置了淘汰策略时,Redis会自动删除一些键来腾空间,你的数据可能是被“淘汰”掉了。
- 检查持久化和重启:如果Redis重启了,它会从持久化文件(RDB或AOF)中恢复数据,如果你没有配置持久化,或者最后一次持久化之后的数据还没来及写入磁盘服务器就宕机了,那么重启后数据就会丢失,确保根据数据重要性配置合适的持久化方案。
主从复制出问题
搭建了主从架构,但从库数据不同步或者断线。
- 查看复制状态:在主从节点上分别执行
info replication命令,查看role(角色)、master_link_status(主从连接状态)、slave_repl_offset(从库复制偏移量)和master_repl_offset(主库复制偏移量)是否接近。 - 网络问题:主从之间网络不稳定是复制中断的元凶之一。
- 主库内存变化太快:如果主库写入压力巨大,生成RDB文件的时间很长,在这期间主库又写入了大量新数据,可能导致复制缓冲区(repl-backlog-buffer)溢出,从而导致全量复制后,增量复制失败,又会触发一次全量复制,形成恶性循环,可以适当调大
repl-backlog-size配置。
总结一下
当Redis出错时,别急着重启,首先看错误日志(Redis的日志文件或系统日志),它通常能给你最直接的线索,然后从最基础的服务状态、连接、内存、配置这几个方面入手,一步步缩小范围,养成监控关键指标(内存、连接数、QPS、延迟)的习惯,能帮你提前发现潜在问题。

本文由召安青于2026-01-06发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/75648.html
