SpringBoot集成Redisson分布式锁

男娘i 2022-12-31 12:28 264阅读 0赞

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

目录

pom.xml依赖配置

application.yml配置

Java 代码配置RedissonClient

测试验证Redis分布式锁


pom.xml依赖配置

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.9.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.redisson</groupId>
  8. <artifactId>redisson</artifactId>
  9. <version>3.14.0</version>
  10. </dependency>

application.yml配置

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

Java 代码配置RedissonClient

  1. package com.patrol.config.redis;
  2. import lombok.Getter;
  3. import lombok.Setter;
  4. import org.redisson.Redisson;
  5. import org.redisson.api.RedissonClient;
  6. import org.redisson.config.Config;
  7. import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  8. import org.springframework.boot.context.properties.ConfigurationProperties;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.stereotype.Component;
  11. /**
  12. * @Copyright: 2019-2021
  13. * @FileName: RedissonConfig.java
  14. * @Author: PJL
  15. * @Date: 2020/12/29 16:33
  16. * @Description: Redisson分布式redis服务支持配置
  17. */
  18. @Getter
  19. @Setter
  20. @Component
  21. @ConfigurationProperties(prefix = "redisson")
  22. @ConditionalOnProperty(name = "redisson.enabled",havingValue = "true")
  23. public class RedissonConfig {
  24. /**
  25. * 服务地址(支持集群)
  26. */
  27. String serverAddress;
  28. /**
  29. * 服务密码
  30. */
  31. String serverPassword;
  32. /**
  33. * 单例数据库实例
  34. */
  35. Integer database;
  36. /**
  37. * 初始化分布式客户端对象
  38. * @return
  39. */
  40. @Bean("redisForDistribution")
  41. public RedissonClient redissonClient(){
  42. String splitChar = ",";
  43. String[] serverAddressArr = serverAddress.split(splitChar);
  44. Config config = new Config();
  45. if (serverAddressArr.length == 1) {
  46. //单例redis
  47. config.useSingleServer()
  48. .setAddress(this.getServerAddress())
  49. .setDatabase(this.getDatabase())
  50. .setPassword(this.getServerPassword());
  51. } else {
  52. //集群redis
  53. config.useClusterServers()
  54. .addNodeAddress(serverAddressArr)
  55. .setPassword(this.getServerPassword());
  56. }
  57. return Redisson.create(config);
  58. }
  59. }

测试验证Redis分布式锁

  1. @Slf4j
  2. @SpringBootTest
  3. class PatrolQualityServiceApplicationTests {
  4. @Qualifier("redisForDistribution")
  5. @Autowired
  6. RedissonClient redissonClient;
  7. /**
  8. * 分布式锁测试
  9. */
  10. @Test
  11. public void initRedisSafe() {
  12. String lockName = "lock-id";
  13. RLock lock = redissonClient.getLock(lockName);
  14. try {
  15. //尝试获取锁 (最多尝试10秒,获取到后15秒后释放锁)
  16. boolean isAcquireLock = lock.tryLock(10, 15, TimeUnit.SECONDS);
  17. if (isAcquireLock) {
  18. try {
  19. log.info("初始化消息统计 --- 获取锁成功 lockName = " + lockName);
  20. // 睡眠10s模拟业务操作
  21. TimeUnit.SECONDS.sleep(10);
  22. log.info("初始化消息统计 --- 初始化业务数据完成!");
  23. } finally {
  24. //释放锁 (在事务提交后才释放锁。保证其它事务在获取锁后能查询到数据,不会再进行初始化。)
  25. lock.unlock();
  26. log.info("初始化消息统计 --- 解锁成功!");
  27. }
  28. } else {
  29. log.error("初始化消息统计 --- 获取锁失败 lockName = " + lockName);
  30. throw new RuntimeException("系统异常");
  31. }
  32. } catch (InterruptedException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }

运行结果:

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

发表评论

表情:
评论列表 (有 0 条评论,264人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springboot使用Redisson分布式

    为什么要使用分布式锁 在分布式场景下为了保证数据最终一致性。在单进程的系统中,存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步(lock—s