Redis明明存在值,为什么有时候取不到?
redis存了某个应用的token,属于是一个热key,调用的频率估计每分钟30次左右;
大部分的时间是能够读取到值的,但是有时候会连着读取不到。
想问一下 大佬们该从哪些角度去排查问题。
命中率在 98.08% 左右
redis信息
高认可度评论:
如果确认 key 一直存在但是「取不到数据」的话,可以从两个方面来定位:一是「取没取」,二是「动没动」。
「取没取」可以通过
monitor
命令定位跟踪下,之前写过一篇文章《Redis 实用小技巧——谁动了我的 Redis ?》,可参考下思路。这一步可以排除程序有没有成功请求到 Redis 。如果第一步没有问题的话,那就看一下「动没动」的问题:即取到的数据有没有经过「过滤层」被过滤掉,这种情况可以根据系统日志进行定位。
抛开以上两个方向,一般概率性的问题,可以考虑请求是否由不同的客户端发起:从服务端角度分析,这一点从
monitor
上可以判断出来。从客户端角度分析,看下有没有使用负载,多进程等,客户端信息存在不同步的情况。laravel 几? 以及是否有用 laravel-s 加速?
排除角度就是你用的是 php-redis 还是 predis, 可以换成另一个(呼唤下),试试效果
是不是 set 的时候设置了过期时间,然后过期了。
也有可能是网络链接问题,我之前做过 Command 里面监听 redis 发布订阅, 然后时间长了 redis 链接超时的问题。 那个问题的表现就是收不到消息了, 后来发现是 redis 链接超时了。 博客:解决 laravel-sail 环境下, redis subscribe 运行一段时间后报错的问...
可以试试用 redis 客户端登录后使用
monitor
命令看看命令被执行的过程。好奇是中间取不到 过了一会又能取到 还是说一直就取不到了
合理猜测是key过期了就取不到,后面又取得到那是过期后又设置了一次。推荐检测过期时间设置是否合理
如果确认 key 一直存在但是「取不到数据」的话,可以从两个方面来定位:一是「取没取」,二是「动没动」。
「取没取」可以通过
monitor
命令定位跟踪下,之前写过一篇文章《Redis 实用小技巧——谁动了我的 Redis ?》,可参考下思路。这一步可以排除程序有没有成功请求到 Redis 。如果第一步没有问题的话,那就看一下「动没动」的问题:即取到的数据有没有经过「过滤层」被过滤掉,这种情况可以根据系统日志进行定位。
抛开以上两个方向,一般概率性的问题,可以考虑请求是否由不同的客户端发起:从服务端角度分析,这一点从
monitor
上可以判断出来。从客户端角度分析,看下有没有使用负载,多进程等,客户端信息存在不同步的情况。monitor 监控一下redis
看下选择的db
检查redis连接池和redis key的命中率
有没有一种情况,瞬间并发大的情况,redis 连接数过多,或redis负载高,阻塞了,取不到; 等负载下降了,又取到了。
说一下存取的命令,还有redis的基本情况。
比如 Redis 是集群么?连接的事代理么?读取时是否使用了 mget 批量读取?
可以预埋一个无用的 key,当取不到 token 时去读取 key
命中率在98.08%左右,但还是有时候查不到数据