SpringBoot集成Redisson分布式锁

Redisson是Redis的集群分布式解决方案。 

目录

pom.xml依赖配置

application.yml配置

Java 代码配置RedissonClient

测试验证Redis分布式锁


pom.xml依赖配置

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>   
    
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.14.0</version>
        </dependency>

application.yml配置

####=======分布式REDIS配置===========
redisson:
  # 是否开启分布式REDIS服务
  enabled: true
  # Redis服务地址 如果集群使用","进行分割
  serverAddress: redis://192.168.1.111:6381
  # redis访问密码
  serverPassword: xxx
  # 单例使用数据库示例
  database: 1

Java 代码配置RedissonClient

package com.patrol.config.redis;

import lombok.Getter;
import lombok.Setter;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * @Copyright: 2019-2021
 * @FileName: RedissonConfig.java
 * @Author: PJL
 * @Date: 2020/12/29 16:33
 * @Description: Redisson分布式redis服务支持配置
 */
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "redisson")
@ConditionalOnProperty(name = "redisson.enabled",havingValue = "true")
public class RedissonConfig {

    /**
     * 服务地址(支持集群)
     */
    String serverAddress;

    /**
     * 服务密码
     */
    String serverPassword;

    /**
     * 单例数据库实例
     */
    Integer database;

    /**
     * 初始化分布式客户端对象
     * @return
     */
    @Bean("redisForDistribution")
    public RedissonClient redissonClient(){
        String splitChar = ",";
        String[] serverAddressArr = serverAddress.split(splitChar);
        Config config = new Config();
        if (serverAddressArr.length == 1) {
            //单例redis
            config.useSingleServer()
                    .setAddress(this.getServerAddress())
                    .setDatabase(this.getDatabase())
                    .setPassword(this.getServerPassword());
        } else {
            //集群redis
            config.useClusterServers()
                    .addNodeAddress(serverAddressArr)
                    .setPassword(this.getServerPassword());
        }
        return Redisson.create(config);
    }
}

测试验证Redis分布式锁

@Slf4j
@SpringBootTest
class PatrolQualityServiceApplicationTests {

    @Qualifier("redisForDistribution")
    @Autowired
    RedissonClient redissonClient;

    /**
     * 分布式锁测试
     */
    @Test
    public void initRedisSafe() {
        String lockName = "lock-id";
        RLock lock = redissonClient.getLock(lockName);
        try {
            //尝试获取锁 (最多尝试10秒,获取到后15秒后释放锁)
            boolean isAcquireLock = lock.tryLock(10, 15, TimeUnit.SECONDS);
            if (isAcquireLock) {
                try {
                    log.info("初始化消息统计 --- 获取锁成功 lockName = " + lockName);
                    // 睡眠10s模拟业务操作
                    TimeUnit.SECONDS.sleep(10);
                    log.info("初始化消息统计 --- 初始化业务数据完成!");
                } finally {
                    //释放锁 (在事务提交后才释放锁。保证其它事务在获取锁后能查询到数据,不会再进行初始化。)
                    lock.unlock();
                    log.info("初始化消息统计 --- 解锁成功!");
                }

            } else {
                log.error("初始化消息统计 --- 获取锁失败 lockName = " + lockName);
                throw new RuntimeException("系统异常");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

运行结果:

2020-12-29 18:31:37.166 [main] INFO  c.p.q.PatrolQualityServiceApplicationTests | 初始化消息统计 --- 获取锁成功 lockName = lock-id
2020-12-29 18:31:49.749 [main] INFO  c.p.q.PatrolQualityServiceApplicationTests | 初始化消息统计 --- 初始化业务数据完成!
2020-12-29 18:31:51.172 [main] INFO  c.p.q.PatrolQualityServiceApplicationTests | 初始化消息统计 --- 解锁成功!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值