最近为一个老代码加新功能,用到了缓存,就随手校验了下缓存是否写入成功,结果发现,根本查不到。缓存逻辑完全无效:缓存写入,前端读不到缓存,还是读的MongoDB的数据,回写到缓存后,下次获取依然读不到缓存。
有点意思啊~~~
碰到这种情况,第一反应是啥?
- 没报错,说明缓存服务正常。但读不到,先看写成功没有。
- 写是成功的,写完立刻读呢?
- 还是读不到,那只有一种可能,数据过期了,于是掉头查TTL。
- TTL 2805660秒,乍一看没啥问题是吧,其实问题就出在这里。
- Memcached::set,这个TTL过期时间是有暗坑的:
Expiration looks at the time given, if the number is less than or equal to 30 days(60 * 60 * 24 * 30 = 2,592,000), then it expires in that many seconds. If the number is greater than 30 days, then it expires at that UNIX time.
超过2592000的秒,会被当做Unix时间戳处理。这就坑了,2805660这个Unix时间戳早就过期了,自然,缓存写入后立马过期,自然取不到了。
定位到问题后,解决起来也就好办了,直接TTL用Unix时间戳即可。
当分享了这个趣事给同事们后,浩哥指出:Memcached的这个实现有问题,TTL是什么意思?Time To Live,而在Memcached的set中,这个TTL的变量存在两种含义。
回头再看Redis,就显得非常专业了,TTL过期的时间是要指定类型的。至此,趣事就分享结束了。
参考资料
如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。
如本文对您有用,捐赠和留言 将是对我最好的支持~(捐赠可转为站内积分)
如愿意,请向朋友推荐本站,谢谢。
尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。
留言