内容简介: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吗
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Cascading Style Sheets 2.0 Programmer's Reference
Eric A. Meyer / McGraw-Hill Osborne Media / 2001-03-20 / USD 19.99
The most authoritative quick reference available for CSS programmers. This handy resource gives you programming essentials at your fingertips, including all the new tags and features in CSS 2.0. You'l......一起来看看 《Cascading Style Sheets 2.0 Programmer's Reference》 这本书的介绍吧!