发现问题的缘由是发现项目日志忽然增大了10倍,后来发现日志中不停的在打印一个不停循环处理任务的线程日志。线程中的处理逻辑用到了redis的缓存锁。html
reids的缓存锁实现再也不详细说,,简单的归纳就是使用setnx的命令,使用时还须要设置过时时间。redis
在redis1.0时,redis对setnx命令的支持只有这一个命令。这就致使设置key,和设置过时时间的时候并不能作到事务性的提交,会存在设置过时时间不成功的可能,再加上墨菲定律就会遇到这种状况。缓存
我以前看的文档比较老,就只看到了redis1.0的文档,就直接致使了此次问题的产生。线程
下面是从新找到了redis新版本的功能。日志
从2.6.12版本开始,redis为SET
命令增长了一系列选项code
EX
seconds – Set the specified expire time, in seconds.PX
milliseconds – Set the specified expire time, in milliseconds.NX
– Only set the key if it does not already exist.XX
– Only set the key if it already exist.htm
EX
seconds – 设置键key的过时时间,单位时秒PX
milliseconds – 设置键key的过时时间,单位时毫秒NX
– 只有键key不存在的时候才会设置key的值XX
– 只有键key存在的时候才会设置key的值注意: 因为SET
命令加上选项已经能够彻底取代SETNX, SETEX, PSETEX的功能,因此在未来的版本中,redis可能会不推荐使用而且最终抛弃这几个命令。blog
修改使用新的命令就能够排除上面提到的问题。事务