内容简介:redis:Redis是开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.采用通过setnx向特定的key值写入一个随机值,并且同时设置失效时间,写值成功即加锁成功.
redis:Redis是开源,内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.
采用 单进程单线程 模型,并发能力强大,主流的分布式缓存工具。
加锁
通过setnx向特定的key值写入一个随机值,并且同时设置失效时间,写值成功即加锁成功.
注意点
- 1.必须给锁加一个失效时间,避免死锁.
- 2.加锁时,每个节点产生一个随机字符串,避免误删锁.
比如:A节点加锁并设置有效时间,A未执行完毕但是锁已经失效了,B节点趁机加锁,此时A节点准备执行解锁动作,若AB节点加锁写入的值相等的话会造成A节点去解锁B节点的锁,显然不行.
- 3.写入随机值与设置有效时间必须同时的,是原子操作,防止未设置有效时间.setnx命令
maven依赖:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.3.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
解锁
匹配随机值,删除 redis 上的特定key的数据,要保证删除动作是原子的,即获取数据丶判断一致丶及删除数据三个操作是原子的。执行如下 lua 脚本:
ARV[1]是value值
if redis.call("get",KEYS[1])==ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
lua脚本丢到服务器上,它认为是一个操作序列不可分开的序列,redis介绍时说过是一个单进程单线程模型,这点要牢牢记住,因此会通过一个线程执行这个脚本之后才会去处理别的请求,因此保证了lua脚本保证了原子性.
代码实现:
加锁:
public boolean tryLock() { //随机生成字符串 String uuid= UUID.randomUUID().toString(); //获取redis原始链接 Jedis jedis = redisManager.getJedis(); //使用setnx命令请求写值,并设置有效时间 String ret=jedis.set(KEY,uuid,"NX","PX",1000); if("OK".equals(ret)){ //供给unlock时从threadLocal获取此值,Thread完成数据共享 local.set(uuid); return true; } return false; }
解锁:
public void unlock() { //读取lua脚本 String script= FileUtils.readFileByLines("lua脚本路径"); Jedis jedis=redisManager.getJedis(); //链接redis执行Lua脚本,value值无法从unlock方法入参了,因此用threadLocal来获取 jedis.eval(script, Arrays.asList(KEY),Arrays.asList(local.get())); }
这里是简单的代码实现具体讲怎么用jedis执行对应的方法,方法不齐的可以自行查阅资料
顺便简单讲下ThreadLoacl //1/做线程级的数据传递,在spring.mybatis随处可见 //2.比如spring的事务传播属性就是通过threadLocal来传递的 //3.tomcat的session也是放在threadLoacl的 private static ThreadLocal<String> local = new ThreadLocal<>();
以上所述就是小编给大家介绍的《Redis分布式锁》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 分布式锁原理——redis分布式锁,zookeeper分布式锁
- 漫谈分布式系统(十):初探分布式事务
- 漫谈分布式系统(十):初探分布式事务
- 漫谈分布式系统(二十三):分布式数据仓库
- 分布式系统中的BASE 和 ACID、幂等性、分布式锁、分布式事务与异步消息处理
- 分布式ID系列(4)——Redis集群实现的分布式ID适合做分布式ID吗
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UNIX网络编程 卷2
W.Richard Stevens / 人民邮电出版社 / 2009-11 / 89.00元
《UNIX网络编程 卷2:进程间通信(英文版·第2版)》是一部UNIX网络编程的经典之作。进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。《UNIX网络编程 卷2:进程间通信(英文版·第2版)》从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同......一起来看看 《UNIX网络编程 卷2》 这本书的介绍吧!