用户反馈token总是很快失效,token是由redis保存的,有效期一小时,而且历史版本中没出现过类似的问题,所以花了点时间排查了一下。
首先,检查登录后token是否正常生成,根据对应的缓存key获取到生成的token,检查发现正常
然后,检查token什么时候消失,用ttl key的方式一直查询token的有效期,发现有效期是正常的一个小时,但是在很短时间内token就被删除了
发现问题是token被删除后,检查下是不是有什么规律,根据删除时间来看,基本稳定在每分钟的25秒左右token会被删除,这样的规律让我考虑是不是用户在服务器上做了什么定时任务删除指定token的,因为其他的一些缓存是正常的
然后开始用crontab检查定时任务,但是并没有什么东西,问了下服务器的运维,也没有做过什么定时任务,有点僵硬
查看了下系统的日志,一直在打印如下的信息,是服务器时间调整,系统层面的了解不多,就先放过去了,这个是重要的一点,但是一开始被我忽略掉了
系统日志没分析出什么,然后查看redis的log,也没有什么异常,就打开了redis的aof,查看下操作记录,总会有记录的吧
以下是redis的操作记录
重点在最下边,发现执行了expire之后redis很快的将key删除了,为了分析,自己在redis-cli里测试了一下
设置有效期为1小时,检查aof,发现很快被删除了
怀疑是redis本身的问题,但是查了很多东西,没发现有别人反馈类似的问题,咨询了下运维,他们对redis基本不了解,不存在修改配置什么的,而且也没什么配置会触发这样的情况,开始怀疑是系统的问题,因为他们反馈之前有做过物理机迁移,系统是重新部署的,想到了之前的系统日志,难道说是由于时间不稳定,一直再跳,导致redis获取的时间不准确?
重新看了下之前的日志,发现有两个时间,一个utc时间,一个北京时间,难道说系统时间在utc时间和北京时间跳来跳去?
系统的东西不会玩,但是redis可以做一下测试,
1.设置有效期是八小时,很快被删除了
2.设置有效期是1天,一直没被删除
3.设置有效期是8小时又两分钟,结果是在三分钟差不多的时间被删除了
好了,到这里基本就清楚问题了,是由于时间设置问题导致系统时间不稳定,在utc时间和北京时间中切换,redis在获取到utc时间的时候就认为对应的缓存过期了,直接del,所以只要修正系统的时钟就可以了,这样的事情还是交给运维去处理吧,over