irpas技术客

Redisson实现分布式锁_swadian2008_redisson分布式锁

未知 712

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:

<!--导入Lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--Spring Data Redis 的启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.7.5</version> </dependency>

2.2.application.properties

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

2.3.Redisson的配置类

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

import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.IOException; @Configuration public class RedissonConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private String port; //@Value("${spring.redis.password}") //private String password; /** * RedissonClient,单机模式 * @return * @throws IOException */ @Bean(destroyMethod = "shutdown") public RedissonClient redisson() throws IOException { Config config = new Config(); //config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password); config.useSingleServer().setAddress("redis://" + host + ":" + port); return Redisson.create(config); } }

2.4.Redisson分布式锁业务类

import lombok.extern.slf4j.Slf4j; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.concurrent.TimeUnit; @Slf4j @Service public class SkillService { @Resource RedissonClient redissonClient; private final static String LOCK_KEY = "RESOURCE_KEY"; int n = 500; public void seckill() { //定义锁 RLock lock = redissonClient.getLock(LOCK_KEY); //lock.lock(); try { //尝试加锁,最大等待时间300毫秒,上锁30毫秒自动解锁 if (lock.tryLock(300, 30, TimeUnit.MILLISECONDS)) { log.info("线程:" + Thread.currentThread().getName() + "获得了锁"); log.info("剩余数量:{}", --n); } } catch (Exception e) { log.error("程序执行异常:{}", e); } finally { log.info("线程:" + Thread.currentThread().getName() + "准备释放锁"); //释放锁 lock.unlock(); } } }

2.5.Redisson分布式锁测试

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class SkillServiceTest { @Autowired SkillService service; @RequestMapping("/testSkillService") public void TestSkillService(){ for (int i = 10; i < 60; i++) { //开50个线程 SkillThread skillThread = new SkillThread(service, "skillThread->" + i); skillThread.start(); } } } class SkillThread extends Thread { private SkillService skillService; public SkillThread(SkillService skillService, String skillThreadName) { super(skillThreadName); this.skillService = skillService; } @Override public void run() { skillService.seckill(); } }

测试结果如下:

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


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #redisson分布式锁 #是最流行的 #NoSQL #数据库解决方案之一而 #JAVA