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