1

我是 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);
}
4

1 回答 1

0

请使用属性键作为 spring.redis.port 和 spring.redis.host。它会起作用的。

于 2021-06-30T08:08:27.843 回答