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);
  }
}

有关脚本命令的更多详细信息,请参阅脚本部分

results matching ""

    No results matching ""