企业管理系统定制开发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开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发