Spring Boot Data Redis管道场景下RedisConnection exists方法始终返回null
问题原因
你在管道回调中直接调用exists()方法获取返回值的写法不符合Spring Data Redis中管道的设计逻辑:
- Redis管道的核心机制是先批量打包所有命令,一次性发送到Redis服务端执行,在回调函数执行的过程中,所有命令都还没有发往Redis,自然不可能当场返回执行结果,因此所有Redis命令的返回值在回调中默认都是null。
- 所有命令的执行结果会在整个管道的命令全部提交、Redis执行完成后,统一封装为List集合作为
executePipelined方法的返回值返回,结果顺序和你在回调中调用命令的顺序完全对应。 - 你之前写的管道set操作能成功修改键值,只是因为命令最终被发送到Redis执行了,如果你在回调中打印
set方法的返回值,同样会得到null,和exists的表现完全一致。
正确实现方式
不要在管道回调中直接获取命令返回值,要在管道执行完成后从返回的结果列表中取值:
// 执行管道,接收所有命令的返回结果 List<Object> pipelinedResults = redisTemplate.executePipelined((RedisCallback<Object>) connection -> { StringRedisConnection stringRedisConnection = (StringRedisConnection) connection; // 第一个命令:设置键值,对应结果列表下标0 stringRedisConnection.set("visited", "true"); // 第二个命令:校验键是否存在,对应结果列表下标1 stringRedisConnection.exists("visited"); // 回调必须返回null,否则会覆盖结果列表 return null; }); // 按命令调用顺序取对应结果 Boolean visitedExists = (Boolean) pipelinedResults.get(1); System.out.println("visited键是否存在:" + visitedExists);
额外说明
- 管道仅适合批量执行多个Redis命令的场景,如果只是单独校验键是否存在,直接使用
redisTemplate.hasKey("visited")即可,无需使用管道,反而会增加不必要的开销。 - 如果管道中执行的是批量操作,可以遍历结果列表获取所有命令的返回值。
内容的提问来源于stack exchange,提问作者Asim
相关产品推荐
相关产品推荐

