setnx创建锁
使用setnx创建key,设置释放时间,这样就是一个锁了。
SET my_resource random_value NX PX 10000
- NX:不存在才添加
- PX:超过时间自动删除。
执行成功即获得了锁
释放锁就是删除key
释放锁通常使用lua脚本来删除key:
-- 删除锁的时候,找到 key 对应的 value,跟自己传过去的 value 做比较,如果是一样的才删除。
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
为什么使用random_value:使用随机值保证唯一,假设第一个锁正常释放,另一个客户端获得了此锁,如果不验证value就直接删除,会有问题。所以采用随机值+lua脚本验证删除释放锁。
缺点:只能用于单机,但是单机故障会有问题。集群会出现:如果某个master挂了,但是key还没同步到slave,此时slave成为master,那么因为slave没有此key,那么其他客户端就会获得锁。