redis缓存锁线上问题

发现问题的缘由是发现项目日志忽然增大了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命令加上选项已经能够彻底取代SETNXSETEXPSETEX的功能,因此在未来的版本中,redis可能会不推荐使用而且最终抛弃这几个命令。blog

修改使用新的命令就能够排除上面提到的问题。事务

相关文章
相关标签/搜索