• 基于Redission实现分布式锁


    pom文件

     <dependency>
                <groupId>org.redisson</groupId>
                <artifactId>redisson-spring-boot-starter</artifactId>
                <version>3.15.0</version>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    
    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.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Component;
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * 分布式锁实现基于Redisson
    
     */
    @Slf4j
    @Component
    public class RedissonLockClient {
    
        @Autowired
        private RedissonClient redissonClient;
    
        @Autowired
        private RedisTemplate<String, Object> redisTemplate;
    
        /**
         * 获取锁
         */
        public RLock getLock(String lockKey) {
            return redissonClient.getLock(lockKey);
        }
    
        /**
         * 加锁操作
         *
         * @return boolean
         */
        public boolean tryLock(String lockName, long expireSeconds) {
            return tryLock(lockName, 0, expireSeconds);
        }
    
    
        /**
         * 加锁操作
         *
         * @return boolean
         */
        public boolean tryLock(String lockName, long waitTime, long expireSeconds) {
            RLock rLock = getLock(lockName);
            boolean getLock = false;
            try {
                getLock = rLock.tryLock(waitTime, expireSeconds, TimeUnit.SECONDS);
                if (getLock) {
                    log.info("获取锁成功,lockName={}", lockName);
                } else {
                    log.info("获取锁失败,lockName={}", lockName);
                }
            } catch (InterruptedException e) {
                log.error("获取式锁异常,lockName=" + lockName, e);
                getLock = false;
            }
            return getLock;
        }
    
    
        public boolean fairLock(String lockKey, TimeUnit unit, int leaseTime) {
            RLock fairLock = redissonClient.getFairLock(lockKey);
            try {
                boolean existKey = existKey(lockKey);
                // 已经存在了,就直接返回
                if (existKey) {
                    return false;
                }
                return fairLock.tryLock(3, leaseTime, unit);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return false;
        }
    
        public boolean existKey(String key) {
            return redisTemplate.hasKey(key);
        }
        /**
         * 锁lockKey
         *
         * @param lockKey
         * @return
         */
        public RLock lock(String lockKey) {
            RLock lock = getLock(lockKey);
            lock.lock();
            return lock;
        }
    
        /**
         * 锁lockKey
         *
         * @param lockKey
         * @param leaseTime
         * @return
         */
        public RLock lock(String lockKey, long leaseTime) {
            RLock lock = getLock(lockKey);
            lock.lock(leaseTime, TimeUnit.SECONDS);
            return lock;
        }
    
    
        /**
         * 解锁
         *
         * @param lockName 锁名称
         */
        public void unlock(String lockName) {
            try {
                redissonClient.getLock(lockName).unlock();
            } catch (Exception e) {
                log.error("解锁异常,lockName=" + lockName, e);
            }
        }
    
    
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125

    配置类

    
    @Configuration
    public class RedissonConfig {
     
        @Value("${spring.redis.host}")
        private String host;
     
        @Value("${spring.redis.port}")
        private String port;
     
        @Bean
        public RedissonClient getRedisson(){
     
            Config config = new Config();
            //单机模式  依次设置redis地址和密码
            config.useSingleServer().
                    setAddress("redis://" + host + ":" + port);
            return Redisson.create(config);
        }
    }
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    gitlab无法push(pre-receive hook declined)
    双非渣本,奋斗3年,阿里四面终拿Offer,定级p6
    python实现将图片数据以LMDB方式存储
    4.3-内置后置PostProcess处理器深度讲解
    声音好听,颜值能打,基于PaddleGAN给人工智能AI语音模型配上动态画面(Python3.10)
    聊聊ChatGLM-6B医疗数据微调
    Java多线程-用代码编程实现模拟机器人对话
    shell学习笔记
    超详细讲解Redis基础类型String增删改查及加减数据(带Java库源码)
    嵌入式开发:为什么无触摸手势对嵌入式GUI开发团队至关重要
  • 原文地址:https://blog.csdn.net/m0_47944994/article/details/133753151