最近为一个老代码加新功能,用到了缓存,就随手校验了下缓存是否写入成功,结果发现,根本查不到。缓存逻辑完全无效:缓存写入,前端读不到缓存,还是读的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过期的时间是要指定类型的。至此,趣事就分享结束了。


参考资料

Memcached::set


如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。

尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。


与《PHP里一个关于Memcached的趣事》相关的博文:


留言

avatar
😀
😀😁😂😅😭🤭😋😘🤔😰😱🤪💪👍👎🤝🌹👌