1. 程式人生 > 實用技巧 >使用Reactive的方式訪問Redis

使用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