排查Redis缓存报错的第一步是检查网络连接是否正常,使用ping命令测试Redis服务器连通性;第二步查看Redis日志文件redis.log,常见错误如OOM(内存不足)可以通过增加maxmemory参数解决;第三步确认key是否存在,使用exists key命令;如果获取失败,可能是序列化问题,确保set和get使用相同序列化方式如Jackson或Kryo;修复方法:重启Redis服务,清理过期key,或调整配置如增大timeout时间。
常见原因1:连接超时
Redis客户端连接超时是获取缓存失败的常见原因,表现为java.net.SocketTimeoutException。解决办法:增加连接池的最大空闲时间和最大连接数,在配置文件中设置timeout=3000,maxTotal=100。
常见原因2:序列化失败
如果使用Spring Cache,获取缓存返回null可能是因为对象未正确序列化。解决方案:在RedisTemplate中配置RedisSerializer,如StringRedisSerializer for key,GenericJackson2JsonRedisSerializer for value。
原因分析:key不存在或已过期
redis获取缓存失败往往是因为key被设置了过期时间TTL后自动删除。使用redis-cli执行TTL key查看剩余时间,如果为-2则key不存在。修复:延长expire时间,或使用持久化策略如RDB或AOF。
内存不足导致的报错
Redis报错"MISCONF Redis is configured to save RDB snapshots",原因是内存不足无法fork子进程。解决:配置maxmemory-policy allkeys-lru,释放内存,或增加服务器物理内存。
集群模式下的问题
在Redis Cluster中,获取失败可能是MOVED或ASK重定向错误。修复:确保客户端支持集群模式,使用JedisCluster或Lettuce,并检查槽位分配是否均衡。
密码认证失败
报错(AUTH FAILED),原因是requirepass设置了密码但客户端未提供。解决:在连接时使用auth password命令,或在Java代码中设置password属性。
FAQ
Q: Redis缓存为什么总是null?
A: 可能是key不存在、已过期或序列化不匹配,检查set/get代码。
Q: 如何查看Redis错误日志?
A: 使用redis-cli命令CONFIG GET logfile找到日志路径,然后tail -f查看。
Q: 连接Redis失败怎么处理?
A: 检查防火墙、端口6379是否开放,ping服务器IP。
Q: 修复OOM错误的方法?
A: 设置maxmemory并配置eviction策略如volatile-lru。