You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于ReactiveRedisOperations响应式写入RedisJSON格式数据?

实现响应式写入RedisJSON格式的方案

先修正原有代码的逻辑问题

你当前的save方法存在响应式编程的逻辑错误:redisOperation.map仅定义了操作但未触发执行,直接返回Mono.just(true)会导致实际并未写入Redis。下面的方案会同时修正这个问题,并实现RedisJSON格式的写入。

前提条件

  • Redis服务器已安装RedisJSON模块(推荐使用Redis Stack,默认包含该模块)
  • Spring Data Redis版本≥2.4.0(确保对RedisJSON命令的响应式支持)
  • 已引入Lettuce驱动(你当前已使用,无需额外调整)

步骤1:调整保存逻辑,执行RedisJSON原生命令

要将对象以RedisJSON类型存储,需要调用Redis专属的JSON.SET命令(而非普通的SET命令)。通过ReactiveRedisOperations的execute方法执行原生命令,实现响应式写入:

@Autowired
ReactiveRedisOperations<String, Foo> redisOperation;
@Autowired
ObjectMapper objectMapper; // 注入全局配置的ObjectMapper,避免重复实例化

public Mono<Boolean> save(Foo foo) {
    return Mono.fromCallable(() -> objectMapper.writeValueAsString(foo))
            // 执行RedisJSON的JSON.SET命令
            .flatMap(json -> redisOperation.execute(connection -> 
                connection.execute(
                    "JSON.SET",
                    // 序列化key为字节数组
                    redisOperation.getKeySerializer().serialize(foo.getId()),
                    // JSON路径:.表示根节点,直接写入整个对象
                    redisOperation.getKeySerializer().serialize("."),
                    // 序列化JSON字符串为字节数组
                    redisOperation.getValueSerializer().serialize(json)
                ).map(result -> true) // 命令执行成功返回"OK",非空则视为写入成功
            ))
            .onErrorReturn(false); // 序列化或命令执行失败时返回false
}

步骤2:(可选)利用已有序列化器简化代码

如果你不想手动调用ObjectMapper,可以直接使用已配置的Jackson2JsonRedisSerializer将Foo对象序列化为JSON字节数组:

@Autowired
ReactiveRedisOperations<String, Foo> redisOperation;

public Mono<Boolean> save(Foo foo) {
    // 获取已配置的Jackson序列化器
    Jackson2JsonRedisSerializer<Foo> serializer = (Jackson2JsonRedisSerializer<Foo>) redisOperation.getValueSerializer();
    byte[] jsonBytes = serializer.serialize(foo);
    
    return redisOperation.execute(connection -> 
        connection.execute(
            "JSON.SET",
            redisOperation.getKeySerializer().serialize(foo.getId()),
            redisOperation.getKeySerializer().serialize("."),
            jsonBytes
        ).map(result -> true)
    ).onErrorReturn(false);
}

关键说明

  • JSON.SET是RedisJSON模块提供的专属命令,专门用于存储JSON类型数据,执行后数据会以Redis的原生JSON类型存储(而非字符串)
  • 整个流程保持响应式编程风格,所有操作都通过Mono封装,避免阻塞
  • 无需使用Lua脚本,直接调用原生RedisJSON命令即可满足需求

内容的提问来源于stack exchange,提问作者2shar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:01:17