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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM