我是 redis 反应式实现的新手。我正在尝试在 localhost:6379 (默认位置)上设置一个使用 redis 的后端。现在文档说“如果要连接到 localhost:6379 的 Redis 服务器,我们不需要添加任何配置代码。”
所以我像往常一样启动了我的redis:
做了一个简单的post请求
{
"uid":"123",
"message":"hello world"
}
到这个控制器
@PostMapping("/api/v1/space/post/")
@ResponseBody
public ResponseEntity<String> postMessage(@RequestBody Message message) throws Exception {
if(messageService.postMessage(message.getUid(), message.getMessage())){
return ResponseEntity.ok("it works!");
} else{
return ResponseEntity.badRequest().body("something's wrong");
}
}
一切都很顺利,日志甚至指出哈希已经创建。但是,当我执行 redis-cli 并检查任何键时,什么都没有。
我也尝试使用 LettuceConnectionFactory 进行连接
@Bean
public ReactiveRedisConnectionFactory reactiveRedisConnectionFactory() {
return new LettuceConnectionFactory("localhost", 6379);
}
然而没有运气,我猜弹簧靴以某种方式连接到嵌入式redis,这不是我想要的,那么我如何连接到redis实例?
编辑
这是消息 repo 和服务 repo 返回一个 MonoIgnorePublisher,在文档中,Mono 要么返回一个元素,要么返回一个错误,这是一个错误吗?:
回购:
private final ReactiveRedisOperations<String, Message> redisTemplate;
public MessageRepository(ReactiveRedisOperations<String, Message> redisOperations) {
this.redisTemplate = redisOperations;
}
public Mono<Void> save(String authorId, String msg) {
Message message = new Message(authorId, msg);
Mono<Void> res = Mono.when(redisTemplate.<String, Message>opsForHash().put("space", message.getId(), message),
redisTemplate.opsForZSet().add(message.getUid(), message, message.getTimestamp().toEpochDay())).then();
System.out.println(res.toString());
return res;
}
服务:
@Autowired
private MessageRepository repo;
public Boolean postMessage(String authorId, String msg) throws Exception {
try{
repo.save(authorId, msg);
}
catch (Exception e){
throw new Exception(e);
}
return true;
}
这是 ReactiveRedisOperation 配置:
@Bean
public ReactiveRedisOperations<String, Message> redisOperations(ReactiveRedisConnectionFactory factory) {
Jackson2JsonRedisSerializer<Message> serializer = new Jackson2JsonRedisSerializer<>(Message.class);
RedisSerializationContext.RedisSerializationContextBuilder<String, Message> builder = RedisSerializationContext
.newSerializationContext(new StringRedisSerializer());
RedisSerializationContext<String, Message> context = builder.value(serializer)
.hashKey(new StringRedisSerializer()).hashValue(serializer).build();
return new ReactiveRedisTemplate<>(factory, context);
}