一.redis 分布式锁:
官方叫做 RedLock 算法,是 redis 官方支持的分布式锁算法。
这个分布式锁有 3 个重要的考量点:
- 互斥(只能有一个客户端获取锁)
- 不能死锁
- 容错(只要大部分 redis 节点创建了这把锁就可以)
第一个最普通的实现方式,就是在 redis 里使用 setnx 命令创建一个 key,这样就算加锁。
bash SET key value NX PX 30000
- 利用nx原子性,多个线程并发的时候,只有一个线程可以设置成功
- 设置成功既获取到锁,可以执行后续的业务处理
- 如果出现异常,过了锁的有效期,锁自动释放
- 释放锁采用redis的delete命令
- NX:表示只有 key 不存在的时候才会设置成功。(如果此时 redis 中存在这个 key,那么设置失败,返回 nil)
- PX 30000:意思是 30s 后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了。
释放锁就是删除 key ,但是一般可以用 lua 脚本删除,判断 value 一样才删除:
-- 删除锁的时候,找到 key 对应的 value,跟自己传过去的 value 做比较,如果是一样的才删除。
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
- 二. redis分布式锁实现分布式定时任务的集群
解决:主要解决定时任务重复执行的问题