pom.xml
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>2.3.0</version>
</dependency>
package com.test.redisson.manager;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
/**
* @version 1.0.0
* @description
* @date 2018/05/04 16:54
**/
public class RedissonManager {
private static RedissonClient redissonClient;
private static Config config = new Config();
/**
* 初始化Redisson,使用哨兵模式
*/
public static void init(){
try {
config.useSentinelServers()
.setMasterName("cache")
.addSentinelAddress("10.0.0.1:26379","10.0.0.2:26379", "10.0.0.3:26379")
//同任何节点建立连接时的等待超时。时间单位是毫秒。默认:10000
.setConnectTimeout(30000)
//当与某个节点的连接断开时,等待与其重新建立连接的时间间隔。时间单位是毫秒。默认:3000
.setReconnectionTimeout(10000)
//等待节点回复命令的时间。该时间从命令发送成功时开始计时。默认:3000
.setTimeout(10000)
//如果尝试达到 retryAttempts(命令失败重试次数) 仍然不能将命令发送至某个指定的节点时,将抛出错误。如果尝试在此限制之内发送成功,则开始启用 timeout(命令等待超时) 计时。默认值:3
.setRetryAttempts(5)
//在一条命令发送失败以后,等待重试发送的时间间隔。时间单位是毫秒。 默认值:1500
.setRetryInterval(3000)
;
redissonClient = Redisson.create(config);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 获取Redisson的实例对象
* @return
*/
public static Redisson getRedisson(){
init();
return (Redisson) redissonClient;
}
/**
* 测试Redisson是否正常
*/
public static void main(String[] args) {
Redisson redisson = RedissonManager.getRedisson();
System.out.println("redisson = " + redisson);
}
}
package com.test.redisson.lockutil;
import com.test.redisson.manager.RedissonManager;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import java.util.concurrent.TimeUnit;
/**
* Redisson分布式锁 工具类
*/
public class LockUtil {
private static Redisson redisson = RedissonManager.getRedisson();
/**
* 根据name对进行上锁操作,redisson Lock 一直等待获取锁
* @param lockname
*/
public static void lock(String lockname) throws InterruptedException {
String key = lockname;
RLock lock = redisson.getLock(key);
//lock提供带timeout参数,timeout结束强制解锁,防止死锁
lock.lock(60L, TimeUnit.SECONDS);
}
/**
* 根据name对进行上锁操作,redisson tryLock 根据第一个参数,一定时间内为获取到锁,则不再等待直接返回boolean。交给上层处理
* @param lockname
*/
public static boolean tryLock(String lockname) throws InterruptedException {
String key = lockname;
RLock lock = redisson.getLock(key);
//tryLock,第一个参数是等待时间,5秒内获取不到锁,则直接返回。 第二个参数 60是60秒后强制释放
return lock.tryLock(5L,60L, TimeUnit.SECONDS);
}
/**
* 根据name对进行解锁操作
* @param lockname
*/
public static void unlock(String lockname){
String key = lockname;
RLock lock = redisson.getLock(key);
lock.unlock();
}
}