您的位置:首页 > 数据库 > Redis

用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包依赖有关的异常,花时间处理这些异常没有意义。

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的话)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: