当前位置:   article > 正文

redis分布式锁 -- 基于redisson实现

redis分布式锁 -- 基于redisson实现

1. 总结

1.1 加锁机制

线程去获取锁,获取成功: 执行 lua脚本,保存数据到 redis数据库

线程去获取锁,获取失败: 一直通过 while循环尝试获取锁,获取成功后,执行 lua脚本,保存数据到 redis数据库。

1.2、watch dog自动延期机制

锁的默认时间是30s,但是看门狗机制会每隔10秒就去验证一下是否已经释放锁,否则就给锁续期

2.配置

2.1引入jar包

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>org.apache.commons</groupId>
  7. <artifactId>commons-pool2</artifactId>
  8. <version>2.6.2</version>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.redisson</groupId>
  12. <artifactId>redisson-spring-boot-starter</artifactId>
  13. <version>3.10.6</version>
  14. </dependency>

2.2 yml 配置

  1. server:
  2. port: 9007
  3. servlet:
  4. context-path: /
  5. spring:
  6. redis:
  7. # 超时时间
  8. timeout: 10000ms
  9. # 服务器地址
  10. host: 127.0.0.1
  11. # 服务器端口
  12. port: 6379
  13. # 数据库
  14. database: 0
  15. # 密码
  16. password: 123456
  17. lettuce:
  18. pool:
  19. # 最大连接数,默认8
  20. max-active: 1024
  21. # 最大连接阻塞等待时间,默认-1
  22. max-wait: 10000ms
  23. # 最大空闲连接
  24. max-idle: 200
  25. # 最小空闲连接
  26. min-idle: 5

 3. redissonConfig

  1. public class RedissonConfig {
  2. @Bean(destroyMethod = "shutdown")
  3. public RedissonClient redissonClient(RedisProperties redisProperties){
  4. Config config = new Config();
  5. SingleServerConfig singleServerConfig = config.useSingleServer();
  6. singleServerConfig.setAddress("redis://" + redisProperties.getHost() + ":" + redisProperties.getPort());
  7. singleServerConfig.setPassword(redisProperties.getPassword());
  8. singleServerConfig.setKeepAlive(true);
  9. // 根据config创建出RedissonClient实例
  10. RedissonClient redissonClient = Redisson.create(config);
  11. return redissonClient;
  12. }
  13. }

4.lock 加锁

  1. @Resource
  2. private RedissonClient redissonClient;
  3. public void lock() {
  4. String begin = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  5. RLock lock = redissonClient.getLock("订单id");
  6. try {
  7. lock.lock();
  8. //lock.lock(4, TimeUnit.SECONDS);
  9. // 模拟业务处理
  10. TimeUnit.SECONDS.sleep(50);
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. } finally {
  14. lock.unlock();
  15. }
  16. String end = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  17. log.info(Thread.currentThread().getName() + "---开始时间:{},, 结束时间{}", begin, end);
  18. }

5.运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/505052
推荐阅读
相关标签
  

闽ICP备14008679号