Redis 是最流行的 NoSQL 数据库解决方案之一,而 Java 是世界上最流行(注意,没有说“最好”)的编程语言之一。虽然两者看起来很自然地在一起“工作”,但是要知道,Redis 其实并没有对 Java 提供原生支持。
相反,作为 Java 开发人员,我们若想在程序中集成 Redis,必须使用 Redis 的第三方库。而 Redisson 就是用于在 Java 程序中操作 Redis 的库,它使得我们可以在程序中轻松地使用 Redis。Redisson 在 java.util 中常用接口的基础上,为我们提供了一系列具有分布式特性的工具类。
Redisson底层采用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。
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();
- }
- }
测试结果如下:
全部都是按照顺序依次执行。
联系客服