打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Redisson实现分布式锁

1、Redisson简介

Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,没有说“最好”)的编程语言之一。虽然两者看起来很自然地在一起“工作”,但是要知道,Redis 其实并没有对 Java 提供原生支持

相反,作为 Java 开发人员,我们若想在程序中集成 Redis,必须使用 Redis 的第三方库。而 Redisson 就是用于在 Java 程序中操作 Redis 的库,它使得我们可以在程序中轻松地使用 Redis。Redisson 在 java.util 中常用接口的基础上,为我们提供了一系列具有分布式特性的工具类。

Redisson底层采用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。

2、Redisson实现分布式锁的步骤

2.1.引入依赖

引入重要的两个依赖,一个是spring-boot-starter-data-redis,一个是redisson:

  1. <!--导入Lombok依赖-->
  2. <dependency>
  3. <groupId>org.projectlombok</groupId>
  4. <artifactId>lombok</artifactId>
  5. </dependency>
  6. <!--Spring Data Redis 的启动器 -->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-redis</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.redisson</groupId>
  13. <artifactId>redisson</artifactId>
  14. <version>3.7.5</version>
  15. </dependency>

2.2.application.properties

  1. # Redis服务器地址
  2. spring.redis.host=192.168.3.28
  3. # Redis服务器连接密码(默认为空)
  4. spring.redis.password=
  5. # Redis服务器连接端口
  6. spring.redis.port=6379

2.3.Redisson的配置类

创建一个redisson的配置类RedissonConfig,内容如下:

  1. import org.redisson.Redisson;
  2. import org.redisson.api.RedissonClient;
  3. import org.redisson.config.Config;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import java.io.IOException;
  8. @Configuration
  9. public class RedissonConfig {
  10. @Value("${spring.redis.host}")
  11. private String host;
  12. @Value("${spring.redis.port}")
  13. private String port;
  14. //@Value("${spring.redis.password}")
  15. //private String password;
  16. /**
  17. * RedissonClient,单机模式
  18. * @return
  19. * @throws IOException
  20. */
  21. @Bean(destroyMethod = "shutdown")
  22. public RedissonClient redisson() throws IOException {
  23. Config config = new Config();
  24. //config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password);
  25. config.useSingleServer().setAddress("redis://" + host + ":" + port);
  26. return Redisson.create(config);
  27. }
  28. }

2.4.Redisson分布式锁业务类

  1. import lombok.extern.slf4j.Slf4j;
  2. import org.redisson.api.RLock;
  3. import org.redisson.api.RedissonClient;
  4. import org.springframework.stereotype.Service;
  5. import javax.annotation.Resource;
  6. import java.util.concurrent.TimeUnit;
  7. @Slf4j
  8. @Service
  9. public class SkillService {
  10. @Resource
  11. RedissonClient redissonClient;
  12. private final static String LOCK_KEY = "RESOURCE_KEY";
  13. int n = 500;
  14. public void seckill() {
  15. //定义锁
  16. RLock lock = redissonClient.getLock(LOCK_KEY);
  17. //lock.lock();
  18. try {
  19. //尝试加锁,最大等待时间300毫秒,上锁30毫秒自动解锁
  20. if (lock.tryLock(300, 30, TimeUnit.MILLISECONDS)) {
  21. log.info("线程:" + Thread.currentThread().getName() + "获得了锁");
  22. log.info("剩余数量:{}", --n);
  23. }
  24. } catch (Exception e) {
  25. log.error("程序执行异常:{}", e);
  26. } finally {
  27. log.info("线程:" + Thread.currentThread().getName() + "准备释放锁");
  28. //释放锁
  29. lock.unlock();
  30. }
  31. }
  32. }

2.5.Redisson分布式锁测试

  1. import org.springframework.beans.factory.annotation.Autowired;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class SkillServiceTest {
  6. @Autowired
  7. SkillService service;
  8. @RequestMapping("/testSkillService")
  9. public void TestSkillService(){
  10. for (int i = 10; i < 60; i++) { //开50个线程
  11. SkillThread skillThread = new SkillThread(service, "skillThread->" + i);
  12. skillThread.start();
  13. }
  14. }
  15. }
  16. class SkillThread extends Thread {
  17. private SkillService skillService;
  18. public SkillThread(SkillService skillService, String skillThreadName) {
  19. super(skillThreadName);
  20. this.skillService = skillService;
  21. }
  22. @Override
  23. public void run() {
  24. skillService.seckill();
  25. }
  26. }

测试结果如下:

全部都是按照顺序依次执行。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何自定义一个starter,你学废了么?
Redisson实现Redis分布式锁的N种姿势
手把手教你 SpringBoot 分布式锁的实现
java接口防重提交如何处理
redis队列定时任务 使用redis的Keyspace Notifications实现定时任务队列
Spring Boot 多数据源 Redis 配置
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服