事件起因
测试同学向我反馈说测试环境经常返回402(登录超时),而且超时时间还不固定,有时候是3分钟,有时候却是1分钟,最最关键的是生产环境并没有这个问题。
我脑子里第一反应是开发同学写了随机的过期时间,导致出现这样的情况。太不让人省心了吧,我已经想到那种尴尬的场面了,哈哈。
排查原因
看代码
一看代码,幸好没有第一时间杀过去,被啪啪打脸,还是贼肿的那种。
代码中都是设置了30分钟的过期时间。
直到看见了这段代码
大家都知道互联网发展迅速,服务器早就由单节点往分布式发展。而早期使用Session的项目由于单点问题开始使用spring-redis-session作为中心化解决方案。
这个注解会将jvm内存中的session以特定的数据结构的形式存放到Redis中,Redis缓存的过期时间就是注解中设置的值。
客户端差错
通过Redis客户端查看后发现,有些key总是会莫名其妙的随机消失。难道真是代码的问题?
我都开始怀疑自己的codeReview能力了。
幸好平时有积累,想到了一个可能,不是主动删除的,有没有可能是被动删除的。灵感来了,赶紧在Console打下I N F O
,
原因
果然,Redis淘汰策略不是用了默认抛出异常的策略,导致在内存快满时将某些key给驱逐掉。
而导致内存占满的原因则是设置的过期时间太长,有些甚至是不删除。
解决
通知其他同事清除不需要用的Key,并且将这作为反面教材。。。。
思考
在使用缓存时,尽量设置RedisKey 的过期时间并且过期时间也不宜太长。比较热数据是要实时查询的,而冷数据的QPS不会大,在查询DB时修改到缓存中即可。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END