一、命令
1、加锁 setnx key value
setnx name aaa
2、设置过期时间 expire key time
expire name 10
3、释放锁 del key
del name
4、加锁过程设置过期时间 set key value nx ex time
set key name nx ex 10
二、防止锁被误删(1)
1、描述
a先抢到锁,上锁,操作一半服务器卡了,卡顿超过过期时间锁被自动释放,这个时候b拿到了锁,上了锁,操作了一半,a反应过来了,操作完毕,开始释放锁,这个时候就把b的锁给误删了。
2、解决方案
加上的时候设置的那个值UUID,含义是本次操作的操作id,如果发现不是自己的UUID就不释放。
三、防止锁被误删(2)
1、描述
a先抢到锁,上锁,操作完成,比较UUID一样,正要删除,这个时候超过过期时间锁被自动释放,这个时候b拿到了锁,上了锁,操作了一半,a把锁删了。
2、解决方案
使用LUA脚本,判断uuid释放一样,一样则删除,不一样就不删除。
$script = "if redis.call('get’, KEYS[1]) == ARGV[1] then return
redis.call(' del’,KEYS[1]) else return 0 end" ;