1. 介绍
Redisson 是一个 java 操作 Redis 的客户端。
提供了大量的分布式数据集来简化对 Redis 的操作和使用,可以让开发者像使用本地集合一样使用 Redis,完全感知不到 Redis 的存在。
2. 种引入方式
- spring boot starter 引入(不推荐,版本迭代太快,容易冲突) 参考
- 直接引入:https://github.com/redisson/redisson#quick-start (推荐)
3. redission的看门狗机制
redisson 中提供的续期机制,开一个监听线程,如果方法还没执行完,就帮你重置 redis 锁的过期时间。
原理:参考
- 监听当前线程,默认过期时间是 30 秒,每 10 秒续期一次(补到 30 秒)
- 如果线程挂掉(注意 debug 模式也会被它当成服务器宕机),则不会续期
4. 具体实现
这里使用第二种:直接引入的方式
参考:直接引入:参考官网
1. 引入依赖
yaml
<!-- https://github.com/redisson/redisson#quick-start -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.27.1</version>
</dependency>
2. 添加配置类,注入Bean
- 这里是使用的单台redis情况,配置从yml配置文件中获取
java
@Configuration
@ConfigurationProperties(prefix = "spring.redis")
@Data
public class RedissionConfig {
// redis域名
private String host;
// redis端口
private String port;
// redis使用库
private int database;
// redis使用库
private String password;
@Bean
public RedissonClient redissonClient() {
// 1. 创建配置
Config config = new Config();
String redisAddress = String.format("redis://%s:%s",host,port);
config.useSingleServer()
.setAddress(redisAddress)
.setPassword(password)
.setDatabase(database);
// 2. 创建Redisson实例
// Sync and Async API
RedissonClient redisson = Redisson.create(config);
// 3. 返回
return redisson;
}
}
3. 使用案例
java
@Component
@Slf4j
public class CacheJob {
@Resource
private RedissonClient redissonClient;
// 定时任务
@Scheduled(cron = "0/10 * * * * ?")
public void doCaCheRecommendUser() {
// 获取分布式锁
RLock lock = redissonClient.getLock("haoyue:precachejob:docache:lock");
try {
// 保证只有一个线程获取锁
boolean tryLock = lock.tryLock(0, -1, TimeUnit.SECONDS);
//System.out.println("getLock: thread:" + Thread.currentThread().getId());
if (tryLock) {
// 业务逻辑
doWork();
}
} catch (InterruptedException e) {
log.error("doWork error", e);
} finally {
// 释放自己的锁
if (lock.isHeldByCurrentThread()) {
//System.out.println("unLock: thread:" + Thread.currentThread().getId());
try {
lock.unlock();
} catch (Exception e) {
log.error("redis unlock error", e);
}
}
}
}
/**
* 具体的业务逻辑
*/
private void doWork() {
// ***
}
}