Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。
官网地址:https://redisson.org/
GitHub地址:https://github.com/redisson/redisson
1.最佳实践
1.1 导入依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.10.6</version>
</dependency>
1.2 配置redis的配置
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.client.RedisClient;
import org.redisson.config.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
/**
* @author 董志伟
* @version 1.0
* @date 2019/7/25 10:33
*/
@Configuration
public class RedisConfig {
@Bean
public RedissonClient getRedisClient() {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("123456");
return Redisson.create(config);
}
}
1.3 常见API
RedissClient中定义了常用的锁
// 创建锁对象,并制定锁的名称
RLock lock = redissonClient.getLock("taskLock");
获取锁对象后,可以通过tryLock()方法获取锁:
有3个重载的方法:
-
三个参数:获取锁,设置锁等待时间
waitTime
、释放时间leaseTime
,时间单位unit
。- 如果获取锁失败后,会在
waitTime
减去获取锁用时的剩余时间段内继续尝试获取锁,如果依然获取失败,则认为获取锁失败; - 获取锁后,如果超过
leaseTime
未释放,为避免死锁会自动释放。
- 如果获取锁失败后,会在
-
两个参数:获取锁,设置锁等待时间
time
、时间单位unit
。释放时间leaseTime
按照默认的30s -
空参:获取锁,
waitTime
默认0s,即获取锁失败不重试,leaseTime
默认30s
任务执行完毕,使用unlock()
方法释放锁:
//释放锁
tasklock.unlock();
1.4 完整测试代码
@Test
public void redissTest() throws InterruptedException {
// 创建锁对象,并制定锁的名称
RLock tasklock = redissonClient.getLock("taskLock");
// 获取锁,设置自动失效时间为50s
boolean isLock = tasklock.tryLock(50,TimeUnit.SECONDS);
// 判断是否获取锁
if (!isLock) {
// 获取失败
log.info("获取锁失败,停止定时任务");
return;
}
try {
// 执行业务
log.info("获取锁成功,执行定时任务。");
// 模拟任务耗时
Thread.sleep(500);
} catch (InterruptedException e) {
log.error("任务执行异常", e);
} finally {
// 释放锁
tasklock.unlock();
log.info("任务执行完毕,释放锁");
}
}