常用的分布式锁
1、redis 对应的开源jar包:redisson
2、zookeeper 对应的开源jar包:curator
使用锁的目的
保证共享资源在同一时间只有只有一个客户端对共性资源进行操作,在高并发的环境下保证同一时间只有一个线程操作共享数据,
根据我自身所阅读的文章总结使用锁or分布式锁
1. 提升效率
采取锁定可以避免不必要的执行相同的工作
2. 提升正确性
采取锁可以更好的规范排列线程之间的关系
分布式锁设计原则
- 互斥性,同一时间只有一个线程持有锁
- 容错性,即使某一个持有锁的线程,异常退出,其他线程任然可以获得锁
- 隔离性,线程只能解自己的锁不能解其他线程的锁
单机分布式锁对比
redis
先说加锁,根据redis官网文档的描述,使用下面的命令加锁
SET resource_name my_random_value NX PX 30000
my_random_value是由客户端生成的一个随机字符串,相当于是客户端持有锁的标志
NX表示只有当resource_name对应的key值不存在的时候才能SET成功,相当于只有第一个请求的客户端才能获得锁
PX 30000表示这个锁有一个30秒的自动过期时间。
至于解锁,为了防止客户端1获得的锁,被客户端2给释放,采用下面的Lua脚本来释放锁
if redis.call(“get”,KEYS[1]) == ARGV[1] then
return redis.call(