使用 Redisson 獲取分佈式鎖

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);
            }
        }
    }
相關文章
相關標籤/搜索