使用 Redisson 获取分布式锁

Redisson是一个基于java编程框架netty进行扩展了的redis,实现了分布式锁和批量的一些操作。

哨兵模式初始化

 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     }

集群模式初始化

    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);
            }
        }
    }
 
  
 


猜你喜欢

转载自www.cnblogs.com/tony-zt/p/10178832.html