使用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
posted @ 2020-08-20 10:47  在线打工者  阅读(11876)  评论(0编辑  收藏  举报