前面写过一篇 错误示例 , 当时写完测试方法不对,就直接放上来了.
后面实际使用过程中发现不行, 这次将改正后的记录下来.
前一篇写了一些锁的概念和为了防止死锁而使用redis对key的有效期来控制超时释放.
这些都是没有问题的.
而上一篇出问题的地方,基本上也是现在网上很多帖子的问题所在.
问题1: 获取锁
原来的获取锁, 是使用setnx 和 expire 两条命令来实现的, 这不是个原子操作. 所以就会导致这过程中出很多问题.
虽然我们上一版对这个做了一些判断, 但是都是无用功, 因为那些判断都不能保证这两条命令的原子性.
但是我们看了redis的api,setnx 命令又没有 expire参数, 怎么办呢?
我们在redis官网看下 setnx命令的说明, 里面有一段描述
这里说明从2.6.12版本后, 就可以使用set来获取锁, Lua 脚本来释放锁
setnx是老黄历了.</