Redisson是一個基於java編程框架netty進行擴展了的redis,實現了分佈式鎖和批量的一些操做。java
哨兵模式初始化node
1 public class RedissonConfig { 2 3 private Redisson redisson; 4 5 private Config config = new Config(); 6 7 @Value("${spring.redis.sentinel.master}") 8 private String masterName; 9 10 @Value("${spring.redis.cluster.nodes}") 11 private String[] address; 12 13 /** 14 * 初始化Redisson 哨兵模式 15 */ 16 @Bean 17 public Redisson getRedisson(){ 18 try { 19 config.useSentinelServers() 20 .setMasterName(masterName) 21 .addSentinelAddress(address) 22 //同任何節點創建鏈接時的等待超時。時間單位是毫秒。默認:10000 23 .setConnectTimeout(30000) 24 //當與某個節點的鏈接斷開時,等待與其從新創建鏈接的時間間隔。時間單位是毫秒。默認:3000 25 .setReconnectionTimeout(10000) 26 //等待節點回覆命令的時間。該時間從命令發送成功時開始計時。默認:3000 27 .setTimeout(10000) 28 //若是嘗試達到 retryAttempts(命令失敗重試次數) 仍然不能將命令發送至某個指定的節點時,將拋出錯誤。若是嘗試在此限制以內發送成功,則開始啓用 timeout(命令等待超時) 計時。默認值:3 29 .setRetryAttempts(5) 30 //在一條命令發送失敗之後,等待重試發送的時間間隔。時間單位是毫秒。 默認值:1500 31 .setRetryInterval(3000) 32 ; 33 redisson = (Redisson) Redisson.create(config); 34 }catch (Exception e){ 35 e.printStackTrace(); 36 } 37 return redisson; 38 }
集羣模式初始化redis
private Redisson redisson; private Config config = new Config(); @Value("${spring.redis.cluster.nodes}") private String[] address; /** * 初始化Redisson 集羣模式 */ @Bean public Redisson getRedisson(){ try { config.useClusterServers() .setScanInterval(2000)//設置集羣狀態掃描時間 .setMasterConnectionPoolSize(10000)//設置鏈接數 .setSlaveConnectionPoolSize(10000) .addNodeAddress(address) //同任何節點創建鏈接時的等待超時。時間單位是毫秒。默認:10000 .setConnectTimeout(30000) //當與某個節點的鏈接斷開時,等待與其從新創建鏈接的時間間隔。時間單位是毫秒。默認:3000 .setReconnectionTimeout(10000) //等待節點回覆命令的時間。該時間從命令發送成功時開始計時。默認:3000 .setTimeout(10000) //若是嘗試達到 retryAttempts(命令失敗重試次數) 仍然不能將命令發送至某個指定的節點時,將拋出錯誤。若是嘗試在此限制以內發送成功,則開始啓用 timeout(命令等待超時) 計時。默認值:3 .setRetryAttempts(5) //在一條命令發送失敗之後,等待重試發送的時間間隔。時間單位是毫秒。 默認值:1500 .setRetryInterval(3000) ; redisson = (Redisson) Redisson.create(config); }catch (Exception e){ e.printStackTrace(); } return redisson; }
獲取分佈式鎖工具類
@Component public class LockUtil { @Autowired private Redisson redisson; /**強制解鎖時間設置*/ private long LOCK_TIME = 2L; /**等待時間**/ private long WAIT_TIME = 3L; /**休眠時間**/ private long SLEEP_TIME = 100; /** * 根據key值獲取鎖 * @param lockName */ public void lock(String lockName){ RLock lock = redisson.getLock(lockName); //lock提供帶timeout參數,timeout結束強制解鎖,防止死鎖 lock.lock(LOCK_TIME, TimeUnit.SECONDS); } /** * 獲取鎖 * @param lockName * @return * @throws InterruptedException */ public boolean tryLock(String lockName) throws InterruptedException { RLock lock = redisson.getLock(lockName); //tryLock,第一個參數是等待時間。 第二個參數 強制鎖釋放時間 return lock.tryLock(WAIT_TIME,LOCK_TIME,TimeUnit.SECONDS); } /** * 解鎖 * @param lockName */ public void unLock(String lockName){ RLock lock = redisson.getLock(lockName); lock.unlock(); } /** * 獲取鎖,一直等待到取到鎖後返回 * @param lockName * @throws InterruptedException */ public boolean getUntilHaveLock(String lockName) throws InterruptedException { while (true){ if(tryLock(lockName)){ return true; }else{ Thread.sleep(SLEEP_TIME); } } }