spring + redisson 集羣同步鎖

一.引入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();
        }
    }

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章