使用Memcached发生的一个错误

昨天发现一个有趣的bug。我们使用memcached缓存一些数据,这些数据正常情况下一天里面是不会变化的(也就是到凌晨前都是有效的)。于是前一个程序员很自然的将缓存的时间设置为(86400000-今天过去的毫秒数)/1000。也就是到凌晨剩下多少秒就过期。而计算过程是每时每刻进行着的,但是是当用户第一次访问的时候开始计算数据,然后存入memcached。于是问题就来了,如果用户刚好在23:59:59左右访问服务,服务器开始计算,等计算完成发现剩余的毫秒数可能在1000以下,也就是不到1秒,然后再除以1000,完了,不够1秒。于是很自然就存入了一个0。结果一个意想不到的问题发生了,memcached默认将0当做是最大过期时间,也就是30天,于是我们就得到一个30天之内都不会变化的数据。而这样显然不是我们需要的,我们的数据每天都是变化的。找到问题后修改起来就容易多了,我们让然计算毫秒数,如果毫秒数不在1分钟和1天之间的,我们就设置成为下限1分钟,上线1天-1分钟。这样保证数据基本上可靠的,有可能在00:00:00~00:00:59近一分钟可能是旧的数据,但是没有关系,这一点点问题我们是可以避免的,当然了完全做到每一秒也是可以的,只是没有必要。在保证大的逻辑方向不出错的情况下,出现一点点数据延时是可以接受的。