Redisson 介绍及使用
一、介绍
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),从而让使用者能够将精力更集中地放在处理业务逻辑上。
一个基于Redis实现的分布式工具,有基本分布式对象和高级又抽象的分布式服务,为每个试图再造分布式轮子的程序员带来了大部分分布式问题的解决办法。
Redisson和Jedis、Lettuce有什么区别?
Redisson和它俩的区别就像一个用鼠标操作图形化界面,一个用命令行操作文件。Redisson是更高层的抽象,Jedis和Lettuce是Redis命令的封装。
-
Jedis是Redis官方推出的用于通过Java连接Redis客户端的一个工具包,提供了Redis的各种命令支持
-
Lettuce是一种可扩展的线程安全的 Redis 客户端,通讯框架基于Netty,支持高级的 Redis 特性,比如哨兵,集群,管道,自动重新连接和Redis数据模型。Spring Boot 2.x 开始 Lettuce 已取代 Jedis 成为首选 Redis 的客户端。
-
Redisson是架设在Redis基础上,通讯基于Netty的综合的、新型的中间件,企业级开发中使用Redis的最佳范本。
Jedis把Redis命令封装好,Lettuce则进一步有了更丰富的Api,也支持集群等模式。但是两者也都点到为止,只给了你操作Redis数据库的脚手架,而Redisson则是基于Redis、Lua和Netty建立起了成熟的分布式解决方案,甚至redis官方都推荐的一种工具集。
二、作用
分布式对象:分布式对象简单来说就是存储在Redis中的Java对象。
Redisson允许你在分布式环境中创建Java对象,并将它们存储在Redis中。这样,不同的Java应用程序或服务就能够共享和访问这些对象,实现数据共享和数据同步。
分布式集合:简单来说就是将集合放在Redis中,并且可以多个客户端对集合进行操作。
Redisson支持常见的分布式数据结构,如List、Set、Map、Queue等,使得多个Java应用程序可以并发地访问和修改这些集合。
分布式锁:通过Redisson,你可以轻松地实现分布式锁,确保在分布式环境中的并发操作的正确性和一致性。
缓存:通过Redisson能够轻松的基于redis实现项目中的缓存。
三、使用示例
1、maven依赖
<!-- 原生,本章使用-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.13.6</version>
</dependency>
<!-- 另一种Spring集成starter,本章未使用 -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.13.6</version>
</dependency>
2、配置类
@Configuration
public class RedissionConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.password}")
private String password;
private int port = 6379;
@Bean
public RedissonClient getRedisson() {
Config config = new Config();
config.useSingleServer().
setAddress("redis://" + redisHost + ":" + port).
setPassword(password);
config.setCodec(new JsonJacksonCodec());
return Redisson.create(config);
}
}
3、使用分布式锁
@Resource
private RedissonClient redissonClient;
RLock rLock = redissonClient.getLock(lockName);
try {
boolean isLocked = rLock.tryLock(expireTime, TimeUnit.MILLISECONDS);
if (isLocked) {
// TODO
}
} catch (Exception e) {
rLock.unlock();
}
4、使用分布式对象
@Test
public void get(){
//获得一个RBucket实现类,参数是redis数据库中的key值
RBucket<User> bucket = redissonClient.getBucket("user:1" );
User user = bucket.get();
System.out.println(user);
}
5、使用分布式集合
@Test
public void list(){
//在redis中创建一个key为testList的list
RList<String> list = redissonClient.getList("testList");
/*
注意:只要执行了add操作,就已经在redis中存入该数据了,并不需要另外的其他操作
*/
list.add("one");
list.add("two");
list.add("three");
}
6、redisson 缓存
Redisson依照Spring Cache标准提供了基于Redis的Spring缓存实现。 每个缓存(Cache)实例都提供了了两个重要的可配置参数:过期时间(ttl)和最长空闲时间(maxIdleTime),如果这两个参数都未指定或值为0,那么实例管理的数据将永久保存。
使用Redisson实现缓存的一般步骤为:
添加依赖
除了之前引入的Redisson的依赖,还添加SpringCache的依赖
<!--这里是SpringCache的启动依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.16.1</version>
</dependency>
启动类添加注解
在项目启动类添加@EnableCaching
注解
配置缓存管理器
在配置类中配置一个缓存管理器
@Configuration
public class RedissonConfiguration {
@Bean
public RedissonClient redissonClient() {
Config config = new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
config.setCodec(new JsonJacksonCodec());
return Redisson.create(config);
}
//这里是一个缓存管理器
@Bean
public CacheManager cacheManager(RedissonClient redissonClient){
/*
为Redisson的缓存管理器设置参数:
1.缓存数据12分钟过期。
2.最长空闲时间为10分钟。
*/
CacheConfig conf = new CacheConfig(12 * 60 * 1000, 10 * 60 * 1000);
HashMap<String, CacheConfig> map = new HashMap<>();
map.put("userCache",conf);
RedissonSpringCacheManager manager = new RedissonSpringCacheManager(redissonClient,map);
return manager;
}
}
使用缓存
这里是模拟通过id查询用户的Service方法。
通过@Cacheable
注解使方法启用缓存。
@Cacheable(value = "userCache",key = "#id",cacheManager = "cacheManager")
public User queryById(Integer id) {
return userMapper.selectById(id);
}
参考: