6.响应式 Redis 支持
本节介绍响应式Redis支持以及如何入门。 你会发现与命令式Redis支持有某些重叠。
6.1. Redis 基本要求
Spring Data Redis需要Redis 2.6或更高版本以及Java SE 8.0或更高版本。 就语言绑定(或连接器)而言,Spring Data Redis目前与Lettuce集成为唯一的反应式Java连接器。 项目反应堆被用作反应性组分库。
6.2. 使用响应式驱动程序连接到Redis
使用Redis和Spring的首要任务之一是通过IoC容器连接到存储仓库。 为此,需要Java连接器(或绑定)。 无论选择哪个库,只需要使用一组Spring Data Redis API,即可在所有连接器(即org.springframework.data.redis.connection包及其ReactiveRedisConnection和ReactiveRedisConnectionFactory接口)中保持一致的行为, 并检索到Redis的活动连接。
6.2.1. Redis操作模式
Redis可以作为独立的服务器,Redis Sentinel或Redis集群模式运行。 Lettuce支持上面提到的所有连接类型。
6.2.2. ReactiveRedisConnection和Reactive RedisConnectionFactory
ReactiveRedisConnection为Redis通信提供构建块,因为它处理与Redis后端的通信。 它还自动将底层驱动程序异常转换为Spring一致的DAO异常层次结构,因此可以在不更改任何代码的情况下切换连接器,因为操作语义保持不变。
活动的ReactiveRedisConnections通过ReactiveRedisConnectionFactory创建。 此外,工厂作为PersistenceExceptionTranslators,意味着一旦声明,他们允许一个做透明的异常转换。 例如,通过使用@Repository注释和AOP进行异常转换。 有关更多信息,请参阅Spring Framework文档中的专用章节。
根据底层配置,工厂可以返回一个新的连接或一个现有的连接(如果使用池或共享本地连接)。
使用Reactive RedisConnectionFactory最简单的方法是通过IoC容器配置适当的连接器,并将其注入到using类中。
6.2.3. 配置Lettuce连接器
Spring Data Redis通过org.springframework.data.redis.connection.lettuce
包支持Lettuce。
为Lettuce设置ReactiveRedisConnectionFactory
可以做如下:
@Bean
public ReactiveRedisConnectionFactory connectionFactory() {
return new LettuceConnectionFactory("localhost", 6379);
}
使用LettuceClientConfigurationBuilder的更复杂的配置(包括SSL和超时)可能如下所示:
@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);
}
有关更详细的客户端配置调整,请参阅LettuceClientConfiguration。
6.3. 通过ReactiveRedisTemplate处理对象
大多数用户可能使用ReactiveRedisTemplate及其相应的包org.springframework.data.redis.core - 由于其丰富的功能集,模板实际上是Redis模块的中心类。 该模板提供了Redis交互的高级抽象。 虽然ReactiveRedisConnection提供接受和返回二进制值(ByteBuffer)的低级方法,但是模板负责序列化和连接管理,从而使用户免于处理这些细节。
此外,该模板提供了操作视图(来自Redis命令参考的分组之后),该视图提供丰富的,通用的接口,用于针对某种类型进行处理,如下所述:
表6.操作视图
接口 | 描述 |
---|---|
配置完成后,该模板是线程安全的,可以在多个实例中重复使用。
开箱即用,ReactiveRedisTemplate在其大部分操作中使用基于Java的序列化程序。 这意味着模板写入或读取的任何对象将通过RedisElementWriter和RedisElementReader进行序列化/反序列化。 序列化上下文在构建时传递给模板,Redis模块在org.springframework.data.redis.serializer包中提供了几个可用实现 - 请参阅序列化程序以获取更多信息。
@Configuration
class RedisConfiguration {
@Bean
ReactiveRedisTemplate<String, String> reactiveRedisTemplate(ReactiveRedisConnectionFactory factory) {
return new ReactiveRedisTemplate<>(connectionFactory, RedisSerializationContext.string());
}
}
public class Example {
@Autowired
private ReactiveRedisTemplate<String, String> template;
public Mono<Long> addLink(String userId, URL url) {
return template.opsForList().leftPush(userId, url.toExternalForm());
}
}
6.4. 响应式脚本
通过响应应式基础架构执行Redis脚本可以使用ReactiveScriptExecutor通过ReactiveRedisTemplate最好地访问。
public class Example {
@Autowired
private ReactiveRedisTemplate<String, String> template;
public Flux<Long> theAnswerToLife() {
DefaultRedisScript<Long> script = new DefaultRedisScript<>();
script.setLocation(new ClassPathResource("META-INF/scripts/42.lua"));
script.setResultType(Long.class);
return reactiveTemplate.execute(script);
}
}
有关脚本命令的更多详细信息,请参阅脚本部分。