如何基于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
相关产品推荐
相关产品推荐

