客户端读写超时
- 读写超时时间设置得过短
- 命令本身就比较慢
- 客户端与服务端网络不正常
- redis自身发生堵塞
客户端连接超时
- 连接超时时间设置过短
- redis发生阻塞,造成tcp-backlog 已满,造成新的连接失败
- 客户端与服务端网络不正常
客户端缓冲区异常
- 输出缓冲区满,例如将普通客户端的输出缓冲区设置为1M 1M 60;
config set client-output-buffer-limit "normal 1048576 1048576 60 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
如果使用get 命令获取一个bigkey(例如3M) ,就会出现异常,因为默认位1M(1048576字节)
- 长时间闲置连接被服务端主动断开(timeout参数设置,当闲置时间大于这个值,就会被服务端主动断开)
- 不正常并发读写
Lua脚本正在执行
如果redis 正在执行lua脚本,并且超过了lua-time-limit ,此时其它客户端调用redis 时,会收到redis busy running a script;
可以使用脚本杀死,script kill 或者 shutdown save
需要注意的是script kill 该命令在脚本执行过写操作是不会生效的,所以要么等待脚本执行结束或者是shutdown save 停掉redis服务,虽然redis脚本好用,但是需要谨慎使用。
redis正在加载持久化文件
如果redis正在加载持久化文件时,客户端调用redis ,就会报loading redis is loading the dataset in memory错误
redis使用的内存超过maxmemory配置
客户端在执行写操作时,如果redis 的使用内存大于maxmemory 的设置,会收到 oom used memory > maxmemory 错误;
此时应该调整maxmemory 的值并造成内存增长的原因。当然这也是因为redis的淘汰策略使用的是默认值:maxmemory-policy:noeviction
noeviction(默认策略):对于写请求不再提供服务,直接返回错误
临时解决方案:config set maxmemory-policy allkeys-lru 设置
客户端连接数过大
如果客户端连接数超过了maxlients ,新的客户端连接就会出现报错:err max number of clients reached
redis 默认值为10000 ,正常都是够用的,出现这种情况属于异常情况,原因很多,需要后续排查。
临时解决方案就是: 下线一些,应用程序中不重要的部分使用,使得连接数降下来 或者调整一下maxclients 值进行问题修复。但是还是得找出根源,不然过段时间又会出现问题。