用redisson依赖redis中间件实现分布式锁RedLock
2017-12-13 00:46
447 查看
redis官方指出,在用redis实现分布式锁时,要用RedLock算法,同时也推荐使用redisson,该开源工具包实现了RedLock算法。
去到redisson的github主页,可以找到redisson官方的例子,本文只分析那个RedLock相关的例子。
redisson 依赖版本推荐用3.4.0-3.4.4版本之间的,最好就用3.4.4版本的。低版本或者高版本的,容易出现其他意想不到的、与jar包依赖有关的异常,花时间处理这些异常没有意义。
上例中,同时有3个线程,t1线程,t线程,主线程。主线程会等待t1线程执行完之后再执行,同时主线程也会最多等待t线程5s之后再执行。
结果是t1线程先执行完,t线程执行一部分(sleep那里阻塞住了),然后主线程执行一部分到lock.lock()这里,等待t线程sleep完之后释放lock锁,主线程接着执行完剩下的,最后再关闭两个连接。
原则上,用Redisson.create(Config config)方法获取Redisson实例(其实也就是redis连接)是很快的,亲测从自己的阿里云香港节点(单redis节点)获取时,第一次时间在1.5s-2s间,之后在200ms左右。
从自己的虚拟机redis单节点获取时,第一次时间也是在1.5s-2s间,之后就在20ms左右。注意,创建一个Redisson实例,就会与redis服务器创建11个tcp连接,真的是11个,一个不多一个不少。如果Redisson不调用shutdown()方法的话,这11个tcp连接就会一直保持。每建一个Redisson实例就有11个连接,而且创建Redisson实例越来越慢,最终就会创建出错(如果都不shutdown的话)。
去到redisson的github主页,可以找到redisson官方的例子,本文只分析那个RedLock相关的例子。
redisson 依赖版本推荐用3.4.0-3.4.4版本之间的,最好就用3.4.4版本的。低版本或者高版本的,容易出现其他意想不到的、与jar包依赖有关的异常,花时间处理这些异常没有意义。
import org.redisson.Redisson; import org.redisson.RedissonMultiLock; import org.redisson.RedissonRedLock; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import java.util.concurrent.TimeUnit; public class RedLockExamples { public static void main(String[] args) throws InterruptedException { Config config = new Config(); config.useSingleServer().setAddress("redis://47.52.238.66:6379").setPassword("6503942ksR@"); RedissonClient client1 = Redisson.create(config); RedissonClient client2 = Redisson.create(config); RLock lock1 = client1.getLock("lock1"); RLock lock2 = client1.getLock("lock2"); RLock lock3 = client2.getLock("lock3"); Thread t1 = new Thread() { @Override public void run() { lock3.lock(); System.out.println(1); } }; t1.start(); t1.join(); Thread t = new Thread() { @Override public void run() { RedissonMultiLock lock = new RedissonRedLock(lock1, lock2, lock3); lock.lock(); try { System.out.println(2); Thread.sleep(10000); } catch (InterruptedException e) { } lock.unlock(); System.out.println(4); } }; t.start(); t.join(5000); lock3.delete(); System.out.println(3); RedissonMultiLock lock = new RedissonRedLock(lock1, lock2, lock3); lock.lock(); System.out.println(5); lock.unlock(); client1.shutdown(0, 1, TimeUnit.MILLISECONDS); client2.shutdown(0, 1, TimeUnit.MILLISECONDS); } }
上例中,同时有3个线程,t1线程,t线程,主线程。主线程会等待t1线程执行完之后再执行,同时主线程也会最多等待t线程5s之后再执行。
结果是t1线程先执行完,t线程执行一部分(sleep那里阻塞住了),然后主线程执行一部分到lock.lock()这里,等待t线程sleep完之后释放lock锁,主线程接着执行完剩下的,最后再关闭两个连接。
原则上,用Redisson.create(Config config)方法获取Redisson实例(其实也就是redis连接)是很快的,亲测从自己的阿里云香港节点(单redis节点)获取时,第一次时间在1.5s-2s间,之后在200ms左右。
从自己的虚拟机redis单节点获取时,第一次时间也是在1.5s-2s间,之后就在20ms左右。注意,创建一个Redisson实例,就会与redis服务器创建11个tcp连接,真的是11个,一个不多一个不少。如果Redisson不调用shutdown()方法的话,这11个tcp连接就会一直保持。每建一个Redisson实例就有11个连接,而且创建Redisson实例越来越慢,最终就会创建出错(如果都不shutdown的话)。
相关文章推荐
- 基于Redis实现分布式锁,Redisson使用及源码分析
- 基于Redis实现分布式锁,Redisson使用及源码分析
- 161230、利用代理中间件实现大规模Redis集群
- 基于Redis实现分布式锁-Redisson使用及源码分析
- 基于Redis实现分布式锁,Redisson使用及源码分析
- Redis分布式锁 基于GETSET SETNX REDISSON 的实现
- 通过Redisson实现基于redis的分布式锁
- 基于Redis实现分布式锁,Redisson使用及源码分析
- 基于Redis实现分布式锁,Redisson使用及源码分析
- Java之——redis并发读写锁,使用Redisson实现分布式锁
- 【Redis】jedis客户端实现redis消息的发布订阅(实时消息中间件)
- Redis实现中间件
- Java之——redis并发读写锁,使用Redisson实现分布式锁
- UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别(转贴)
- Redis实现微博后台业务逻辑系列(二)
- redis集群实现(四) 数据的和槽位的分配
- 详解UML中的6大关系(关联、依赖、聚合、组合、泛化、实现)
- 基于redis的高并发秒杀的JAVA-DEMO实现!
- tomcat+nginx+redis实现均衡负载、session共享(一)
- 类的6大关系:依赖,关联,聚合,组合,泛化,实现