1、前言
基于Redis实现单节点的分布式锁详见:基于Redis实现单节点分布式锁
本文使用Redisson实现Redis的主从模式、sentinel模式和Cluster模式的分布式锁
2、实现过程
①、引入redisson的pom依赖;
②、配置SpringBootapplication.yml中的redis信息,注意不同集群模式下要切换端口;
③、配置RedissonUtils,如下:
public class RedissonUtils {
private static Logger logger = LoggerFactory.getLogger(RedissonUtils.class);
private static RedissonUtils redissonUtils;
public RedissonUtils() {
}
/**
* 提供单例模式
* @return
*/
public static RedissonUtils getInstance(){
if(redissonUtils == null){
synchronized (RedissonUtils.class){
if (redissonUtils == null)
redissonUtils = new RedissonUtils();
}
}
return redissonUtils;
}
/**
* 获取 RedissonClient
* @param config
* @return
*/
public RedissonClient getRedission(Config config){
RedissonClient redissonClient = Redisson.create(config);
logger.info("---------- 成功连接redis server ---------");
return redissonClient;
}
public void closeRedisson(RedissonClient redissonClient){
redissonClient.shutdown();
logger.info("---------- redissonclient成功关闭 ----------");
}
}
关于Redisson的其他获取比如Set、SortedSet、List等集合的配置参考:基于redission的分布式锁
④、三种集群方式测试
- 主从模式:
@Test
public void testMasterSlaveDistributedLock(){
Config config = new Config();
config.useMasterSlaveServers().setMasterAddress("redis://127.0.0.1:6390")
.addSlaveAddress("redis://127.0.0.1:6391","redis://127.0.0.1:6392");
RedissonClient redissonClient = new RedissonUtils().getRedission(config);
RLock rLock = redissonClient.getLock("master_slave_distributed_lock");
try {
boolean res = rLock.tryLock(0,1,TimeUnit.SECONDS);
if (res){
System.out.println("********** success **********");
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
rLock.unlock();
}
}
- sentinel模式
- 配置yml:
sentinel:
master: mymaster
nodes: 127.0.0.1:26579,127.0.0.1:26479,127.0.0.1:26379
测试:
@Test
public void testSentinelDistributedLock(){
Config config = new Config();
config.useSentinelServers().setMasterName("mymaster").addSentinelAddress("redis://127.0.0.1:26379","redis://127.0.0.1:26479","redis://127.0.0.1:26579");
RedissonClient redissonClient = new RedissonUtils().getRedission(config);
RLock rLock = redissonClient.getLock("sentinel_distributed_lock");
try {
boolean res = rLock.tryLock(100,10,TimeUnit.SECONDS);
if (res){
System.out.println("********** success **********");
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
rLock.unlock();
}
}
- Cluster模式
先在application.yml中配置集群:
cluster:
nodes: 127.0.0.1:6381,127.0.0.1:6382,127.0.0.1:6383,127.0.0.1:6384,127.0.0.1:6385
测试如下:
@Test
public void testCliusterDistributedLock(){
Config config = new Config();
config.useClusterServers().setScanInterval(2000).
addNodeAddress("redis://127.0.0.1:6380","redis://127.0.0.1:6381","redis://127.0.0.1:6382","redis://127.0.0.1:6383","redis://127.0.0.1:6384","redis://127.0.0.1:6385");
RedissonClient redissonClient = new RedissonUtils().getRedission(config);
RLock rLock = redissonClient.getLock("cluster_distributed_lock");
try {
boolean res = rLock.tryLock(100,10,TimeUnit.SECONDS);
if (res){
System.out.println("********** success **********");
}
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
rLock.unlock();
}
}
基于Redisson实现分布式锁的原理推荐文章:Redisson