Redis Pipeline中exec与sync的区别(基于Jedis示例)
Redis Pipeline中
exec()和sync()的区别(Jedis示例解析) 哥们儿,我来给你掰扯清楚Jedis里Pipeline的exec()和sync()到底有啥不一样,结合你贴的两个代码示例来看,一下子就明白了:
先看示例代码的格式化版本
示例1:使用exec()的实现
try (Jedis resource = redisManager.getResource()) { Pipeline pipeline = resource.pipelined(); pipeline.multi(); pipeline.del("test-1"); pipeline.hset("test-2", "a", "b"); pipeline.exec(); }
示例2:使用sync()的实现
try (Jedis resource = redisManager.getResource()) { Pipeline pipeline = resource.pipelined(); pipeline.multi(); pipeline.del("test-1"); pipeline.hset("test-2", "a", "b"); pipeline.sync(); }
1. exec()的作用与示例表现
exec()本质是Redis事务的提交命令,和Redis原生的EXEC指令完全对应:
- 当你通过
pipeline.multi()开启事务后,后续添加的del、hset都会被放进Redis的事务队列里,此时调用exec(),就是告诉Redis:「把这个事务队列里的命令全执行了!」 - 示例1里,Redis会原子性执行这两个命令——要么全部成功,要么全部失败,同时Jedis会返回这两个命令的实际执行结果(比如
del返回删除的Key数量,hset返回是否新增了字段)。 - 额外提一句:如果Pipeline里没开事务,单独调用
exec()也能触发命令发送,但这种用法非常少见,因为exec()的核心定位就是事务提交。
2. sync()的作用与示例表现
sync()是Pipeline的批量同步工具,核心逻辑是:把Pipeline中缓存的所有命令一次性发给Redis,然后等待Redis返回所有命令的即时响应:
- 示例2里,你虽然开了事务加了两个命令,但调用
sync()后,Redis只会收到MULTI、DEL test-1、HSET test-2 a b这三个命令——注意!DEL和HSET只是被放进了事务队列,Redis不会执行它们,因为你没发EXEC指令! - 这时候
sync()返回的结果里,MULTI会返回OK,后面两个命令的结果是QUEUED,代表它们被加入队列但还没执行,事务处于「已开启但未提交」的状态。
核心区别总结
- 定位不同:
exec()是事务专属的提交指令,负责触发Redis执行事务队列;sync()是Pipeline的批量提交工具,只负责把缓存的命令一次性发出去并取回响应。 - 事务场景表现不同:在开启
multi()的Pipeline中,exec()会直接提交事务并执行所有队列内的命令;sync()只是把事务相关命令发送给Redis,不会触发事务执行,必须额外调用exec()才行。 - 返回结果不同:
exec()返回事务内所有命令的实际执行结果;sync()返回所有发送命令的即时响应(比如事务队列里的命令会返回QUEUED,而非实际执行结果)。
内容的提问来源于stack exchange,提问作者Obyvante




