zoukankan      html  css  js  c++  java
  • 【java】Redisson获取分布式锁

    1. maven

      <!-- redisson 分布式锁 -->
      <dependency>
          <groupId>org.redisson</groupId>
          <artifactId>redisson</artifactId>
          <version>3.11.2</version>
    </dependency>

    2. redisson客户端配置类

    package harara.redis;
    
    import harara.StringUtil;
    import org.redisson.Redisson;
    import org.redisson.api.RedissonClient;
    import org.redisson.config.Config;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.stereotype.Component;
    
    /**
     * @author: chenly
     * @date: 2019-11-05 19:58
     * @description:  redisson客户端配置类
     * @version: 1.0
     */
    @Configuration
    @Component
    public class RedissonManager {
    
        /**redis集群节点*/
        @Value(value = "${spring.redis.cluster.nodes:#{null}}")
        private String cluster;
    
        /**redis密码*/
        @Value("${spring.redis.password:#{null}}")
        private String password;
    
        /**redis 单节点ip*/
        @Value("${spring.redis.host:#{null}}")
        private String host;
    
        /**redis单节点端口*/
        @Value("${spring.redis.port:#{null}}")
        private String port;
    
        /**最大连接数*/
        @Value("${spring.redis.jedis.pool.max-active:30}")
        private int maxPoolSize;
    
    
        @Bean
        public RedissonClient getRedissonClient(){
            return loadRedisson();
        }
    
    
        public RedissonClient loadRedisson(){
            RedissonClient client = null;
            Config config = new Config();
            //单节点
            if (!StringUtil.isEmpty(host)) {
                config.useSingleServer().
                        setAddress("redis://" + host + ":" + port)
    //                    .setPassword(password)
                        .setConnectionPoolSize(maxPoolSize)
                        //最小空闲连接
                        .setConnectionMinimumIdleSize(0);
                //如果密码不为空,设置密码
                if(!StringUtil.isEmpty(password)){
                    config.useSingleServer().setPassword(password);
                }
                client = Redisson.create(config);
            } else {
                //集群节点
                String[] nodes = cluster.split(",");
                //redisson版本是3.5,集群的ip前面要加上“redis://”,不然会报错,3.2版本可不加
                for (int i = 0; i < nodes.length; i++) {
                    nodes[i] = "redis://" + nodes[i];
                }
                //这是用的集群server
                config.useClusterServers()
                        //设置集群状态扫描时间2000
                        .setScanInterval(2000)
                        .addNodeAddress(nodes)
    //                    .setPassword(password)
                        .setMasterConnectionPoolSize(maxPoolSize)
                        //最小空闲连接
                        .setMasterConnectionMinimumIdleSize(0);
                //如果密码不为空,设置集群密码
                if (!StringUtil.isEmpty(password)) {
                    config.useClusterServers().setPassword(password);
                }
                client = Redisson.create(config);
    //            System.out.println(config.);
                //可通过打印redisson.getConfig().toJSON().toString()来检测是否配置成功
            }
            return client;
        }
    
    
    
    
    
    }

    3.获取锁类(加锁,解锁)

    package harara.redis;
    
    import lombok.extern.slf4j.Slf4j;
    import org.redisson.api.RLock;
    import org.redisson.api.RedissonClient;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author: chenly
     * @date: 2019-11-05 20:29
     * @description: 获取redisson分布式锁类
     * @version: 1.0
     */
    @Component
    @Slf4j
    public class RedissonDistributedLocker {
    
        @Autowired
        private RedissonClient redissonClient;
    
        /**
         * lock(),拿不到lock就不罢休,不然线程就一直block
         * @param lockKey
         * @return
         */
        public RLock lock(String lockKey){
            RLock lock = redissonClient.getLock(lockKey);
            lock.lock();
            return lock;
        }
    
        /**
         * leaseTime为加锁时间,单位为秒
         * @param lockKey  锁的名称
         * @param leaseTime 加锁时间,单位秒
         * @return
         */
        public RLock lock(String lockKey,long leaseTime){
            RLock lock = redissonClient.getLock(lockKey);
            lock.lock(leaseTime, TimeUnit.SECONDS);
            return lock;
        }
    
        /**
         * leaseTime为加锁时间,单位为秒
         * @param lockKey 锁的名称
         * @param unit  时间单位
         * @param leaseTime  加锁时间
         * @return
         */
        public RLock lock(String lockKey,TimeUnit unit,long leaseTime){
            RLock lock = redissonClient.getLock(lockKey);
            lock.lock(leaseTime,unit);
            return lock;
        }
    
    
        /**
         * 加锁
         * tryLock(),马上返回,拿到lock就返回true,不然返回false。
         * 带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false.
         * @param lockKey 锁的名称
         * @param unit   单位名称
         * @param waitTime  等待时间
         * @param leaseTime 加锁时间
         * @return
         */
        public boolean tryLock(String lockKey,TimeUnit unit,long waitTime,long leaseTime){
            RLock lock = redissonClient.getLock(lockKey);
            try{
                lock.tryLock(waitTime,leaseTime,unit);
                return true;
            }catch (InterruptedException e){
                return false;
            }
        }
    
        /**
         *
         * 带时间限制的tryLock(),拿不到lock,就等一段时间,超时返回false.
         * @param lockKey
         * @param waitTime
         * @return
         */
        public boolean tryLock(String lockKey,long waitTime,TimeUnit unit){
            RLock rLock = redissonClient.getLock(lockKey);
            try{
                rLock.tryLock(waitTime,unit);
                return true;
            }catch (InterruptedException e){
                return false;
            }
        }
    
        /**
         * 解锁
         * @param lockKey  锁的名称
         */
        public void unlock(String lockKey){
            RLock lock = redissonClient.getLock(lockKey);
            lock.unlock();
        }
    
        /**
         * 解锁
         * @param lock 锁
         */
        public void unlock(RLock lock){
            lock.unlock();
        }
    }
  • 相关阅读:
    D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
    Vijos P1389婚礼上的小杉
    AIM Tech Round (Div. 2) C. Graph and String
    HDU 5627Clarke and MST
    bzoj 3332 旧试题
    codeforces 842C Ilya And The Tree
    codesforces 671D Roads in Yusland
    Travelling
    codeforces 606C Sorting Railway Cars
    codeforces 651C Watchmen
  • 原文地址:https://www.cnblogs.com/kiko2014551511/p/11801640.html
Copyright © 2011-2022 走看看