响应式 Redis 是指使用响应式编程模型来操作 Redis 数据库的方式。传统的 Redis 客户端通常采用同步或阻塞式调用,这意味着当客户端发送请求给 Redis 服务器时,它会等待直到收到响应。在高并发的情况下,这可能导致线程阻塞,降低系统的性能和响应性。
响应式 Redis 的出现是为了解决这个问题。它采用了响应式编程的思想,允许开发者以异步、非阻塞的方式与 Redis 进行交互。这意味着当发出一个请求后,客户端不会阻塞等待响应,而是可以继续执行其他操作。一旦收到 Redis 的响应,它可以通过回调、流或其他异步机制进行处理。
通常,响应式 Redis 会与响应式编程框架(如 Reactor、RxJava)结合使用,以提供一套异步的 API,用于执行 Redis 命令并处理结果。这种方式可以更有效地利用系统资源,提高应用程序的性能、并发能力和响应性。
总的来说,响应式 Redis 是一种使用响应式编程模型来操作 Redis 数据库的方式,旨在提高系统的性能和响应性,特别是在高并发、高负载的场景下。
1、引用Maven依赖
<!-- redis and reactive redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
<version>2.7.9</version>
</dependency>
2、YAML配置
spring:
redis:
cluster:
nodes:
- 127.0.0.1:6379
username: 123
password: 321
lettuce:
shutdown-timeout: 10s
pool:
max-active: 8
max-wait: -1
min-idle: 0
3、Redis配置类
/**
* @author Lucas
* date 2024/3/9 17:37
* description Redis配置类
*/
@Configuration
public class RedisConfig {
/**
* 序列化相关配置新信息
* @param connectionFactory
* @return
*/
@Bean
public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(ReactiveRedisConnectionFactory connectionFactory) {
RedisSerializationContext.RedisSerializationContextBuilder<String, Object> builder =
RedisSerializationContext.newSerializationContext();
Jackson2JsonRedisSerializer<Object> jsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
jsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
builder.key(stringRedisSerializer);
builder.value(jsonRedisSerializer);
builder.hashKey(stringRedisSerializer);
builder.hashValue(jsonRedisSerializer);
return new ReactiveRedisTemplate<>(connectionFactory,builder.build());
}
}
4、代码实现
/**
* @author Lucas
* date 2024/3/6 18:23
* description 测试Redis
*/
@Slf4j
@Component
public class RedisTest {
@Resource
private ReactiveRedisTemplate<String, String> reactiveRedisTemplate;
/**
* 获取KEY数据
* @param key
* @return
*/
public Mono<String> getTestRedis(String key){
return reactiveRedisTemplate.opsForValue().get(key).defaultIfEmpty("").flatMap(i -> {
if(StrUtil.isBlank(i)){
log.info("未获取到任何信息,key:{}",key);
Mono.error(new Exception("未获取到redis任何信息"));
}
return Mono.just(i);
});
}
/**
* 新增redis数据
* @param key
* @param value
* @return
*/
public void setTest(String key, String value){
reactiveRedisTemplate.opsForValue().set(key, value, Duration.ofMinutes(5)).subscribe(logs -> {
log.info("新增缓存信息,信息内容key:{},value:{},结果:{}", key, value, logs);
});
}
}