使用Reactive的方式访问Redis
18使用Reactive的方式访问Redis
一、Spring Data Redis对Reactive的支持
1.1 Lettuce客户端支持Reactive
我们直到在Spring Data Redis中同时支持了Jedis客户端和Lettuce客户端。但是仅Lettuce是支持Reactive方式的操作,所以如果你希望使用Reactive方式那你只能选择Lettuce客户端。
1.2 Spring Data Redis中的主要类
- ReactiveRedisConnection
ReactiveRedisConnection是Redis通信的核心,因为它处理与Redis后端的通信。 它还会自动将底层驱动程序异常转换为Spring一致的DAO异常层次结构,因此您可以在不更改任何代码的情况下切换连接器,因为操作语义保持不变。
- ReactiveRediscoverConnectionFactory
ReactiveRedisConnectionFactory创建活动的ReactiveRedisConnection实例。 此外,工厂还充当PersistenceExceptionTranslator实例,这意味着工厂一旦声明,就可以进行透明的异常转换-例如,通过使用@Repository批注和AOP进行异常转换。
- ReactiveRedisTemplate
用来操作的类
- opsForXxx() 方法
二、Talk is cheap,show me the code
2.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
2.2 配置Lettuce连接
Spring Data Redis 通过org.springframework.data.redis.connection.lettuce
包来支持Lettuce
。通过如下代码为Lettuce 创建一个ReactiveRedisConnectionFactory
@Bean
public ReactiveRedisConnectionFactory connectionFactory() {
return new LettuceConnectionFactory("localhost", 6379);
}
如果需要处理ssl、超时时间等问题可以使用LettuceClientConfigurationBuilder
。
@Bean
public ReactiveRedisConnectionFactory lettuceConnectionFactory() {
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.useSsl().and()
.commandTimeout(Duration.ofSeconds(2))
.shutdownTimeout(Duration.ZERO)
.build();
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("localhost", 6379), clientConfig);
}
2.3 ReactiveStringRedisTemplate的Bean定义
大多数用户可能会使用ReactiveRedisTemplate及其相应的包org.springframework.data.redis.core。 由于其丰富的功能集,ReactiveRedisTemplate实际上是Redis模块的中心类。 ReactiveRedisTemplate为Redis交互提供了高级抽象。 尽管ReactiveRedisConnection提供了接受和返回二进制值(ByteBuffer)的低级方法,但ReactiveRedisTemplate负责序列化和连接管理,使您无需处理此类细节。
ReactiveStringRedisTemplate 是ReactiveRedisTemplate的子类。是K、V都是String类型的一个操作类,是Spring 官方提供的。使用的时候有版本要求需要注意。
使用ReactiveStringRedisTemplate定义Bean
@Bean
ReactiveStringRedisTemplate reactiveStringRedisTemplate(ReactiveRedisConnectionFactory factory) {
return new ReactiveStringRedisTemplate(factory);
}
使用ReactiveRedisTemplate来定义Bean
@Bean
ReactiveRedisTemplate<String, String> reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
return new ReactiveRedisTemplate<>(factory, RedisSerializationContext.string());
}
2.4 操作
@Override
public void run(String... args) throws Exception {
reactiveRedisTemplate
.opsForValue()
.set("name", "李四")
.subscribe(b -> log.info("set result:{}", b),
e -> log.error("set data error:{}", e));
}
打印结果如下:
2020-08-20 10:35:03.856 INFO 4145 --- [ioEventLoop-6-1] com.lucky.spring.Application : set result:true
ReactiveRedisTemplate提供了一系列的opsForXxx方法(根据Redis命令参考进行分组),这些操作视图提供了丰富的通用接口来针对某种类型进行工作,如下表所述:
Interface | Description |
---|---|
Key Type Operations | |
ReactiveGeoOperations | Redis geospatial operations such as GEOADD , GEORADIUS , and others) |
ReactiveHashOperations | Redis hash operations |
ReactiveHyperLogLogOperations | Redis HyperLogLog operations such as (PFADD , PFCOUNT , and others) |
ReactiveListOperations | Redis list operations |
ReactiveSetOperations | Redis set operations |
ReactiveValueOperations | Redis string (or value) operations |
ReactiveZSetOperations | Redis zset (or sorted set) operations |