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 |