问题描述
我是Redis反应式实现的新手。我正在尝试设置一个在localhost:6379(默认位置)上使用Redis的后端。现在documentation说:“如果要连接到本地主机:6379的Redis服务器,我们不需要添加任何配置代码。”
所以我像往常一样开始重做:
提出了一个简单的发帖请求
{
"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实例?
编辑
这是邮件回购和服务 仓库返回一个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);
}
解决方法
请将属性键设为 spring.redis.port 和 spring.redis.host。它会起作用。