You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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()开启事务后,后续添加的delhset都会被放进Redis的事务队列里,此时调用exec(),就是告诉Redis:「把这个事务队列里的命令全执行了!」
  • 示例1里,Redis会原子性执行这两个命令——要么全部成功,要么全部失败,同时Jedis会返回这两个命令的实际执行结果(比如del返回删除的Key数量,hset返回是否新增了字段)。
  • 额外提一句:如果Pipeline里没开事务,单独调用exec()也能触发命令发送,但这种用法非常少见,因为exec()的核心定位就是事务提交。

2. sync()的作用与示例表现

sync()Pipeline的批量同步工具,核心逻辑是:把Pipeline中缓存的所有命令一次性发给Redis,然后等待Redis返回所有命令的即时响应:

  • 示例2里,你虽然开了事务加了两个命令,但调用sync()后,Redis只会收到MULTIDEL test-1HSET test-2 a b这三个命令——注意!DELHSET只是被放进了事务队列,Redis不会执行它们,因为你没发EXEC指令!
  • 这时候sync()返回的结果里,MULTI会返回OK,后面两个命令的结果是QUEUED,代表它们被加入队列但还没执行,事务处于「已开启但未提交」的状态。

核心区别总结

  • 定位不同exec()是事务专属的提交指令,负责触发Redis执行事务队列;sync()是Pipeline的批量提交工具,只负责把缓存的命令一次性发出去并取回响应。
  • 事务场景表现不同:在开启multi()的Pipeline中,exec()会直接提交事务并执行所有队列内的命令;sync()只是把事务相关命令发送给Redis,不会触发事务执行,必须额外调用exec()才行。
  • 返回结果不同exec()返回事务内所有命令的实际执行结果sync()返回所有发送命令的即时响应(比如事务队列里的命令会返回QUEUED,而非实际执行结果)。

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

火山引擎 最新活动