一.引入pom文件 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>2.2.13</version> </dependency>
import org.redisson.Config;
import org.redisson.Redisson;
import org.redisson.RedissonClient;
import org.redisson.core.RAtomicLong;
import org.redisson.core.RLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.TimeUnit;
/**
* @author Ailen
* @version Id: DistributedRedisLock.java,Exp $$
*/
public class DistributedRedisLock {
// NX是不存在時才set, XX是存在時才set, EX是秒,PX是毫秒
private static final Logger logger = LoggerFactory.getLogger(DistributedRedisLock.class);
private static RedissonClient redisson = RedissonManager.getRedisson();
public static RLock getLock(String lockKey, int expireTime, TimeUnit timeUnit) {
RLock mylock = redisson.getLock(lockKey);
mylock.lock(expireTime, timeUnit);
logger.info("獲取分佈式鎖 Key:{}", lockKey);
return mylock;
}
public static void unLock(String lockKey) {
RLock mylock = redisson.getLock(lockKey);
mylock.unlock();
logger.info("釋放分佈式鎖 Key:{}", lockKey);
}
static class RedissonManager {
private static final String RAtomicName = "genId_";
private static Config config = new Config();
private static RedissonClient redisson = null;
public static void init() {
try {
config.useClusterServers()
//設置集羣狀態掃描間隔
.setScanInterval(200000)
//設置對於master節點的連接池中連接數最大爲10000
.setMasterConnectionPoolSize(10000)
//設置對於slave節點的連接池中連接數最大爲500
.setSlaveConnectionPoolSize(10000)
//如果當前連接池裏的連接數量超過了最小空閒連接數,而同時有連接空閒時間超過了該數值,那麼這些連接將會自動被關閉,並從連接池裏去掉。時間單位是毫秒。
.setIdleConnectionTimeout(10000)
//同任何節點建立連接時的等待超時。時間單位是毫秒。
.setConnectTimeout(30000)
//等待節點回覆命令的時間。該時間從命令發送成功時開始計時。
.setTimeout(3000)
//當與某個節點的連接斷開時,等待與其重新建立連接的時間間隔。時間單位是毫秒。
.setRetryInterval(3000)
.addNodeAddress("redis://10.10.156.241:7000", "redis://10.10.156.241:7001", "redis://10.10.156.241:7002");
redisson = Redisson.create(config);
RAtomicLong atomicLong = redisson.getAtomicLong(RAtomicName);
//自增設置爲從1開始
atomicLong.set(1);
} catch (Exception e) {
e.printStackTrace();
}
}
public static RedissonClient getRedisson() {
if (redisson == null) {
RedissonManager.init(); //初始化
}
return redisson;
}
/**
* 獲取redis中的原子ID
*/
public static Long nextID() {
RAtomicLong atomicLong = getRedisson().getAtomicLong(RAtomicName);
atomicLong.incrementAndGet();
return atomicLong.get();
}
}
}