10.3. 命令的批量执行

多个连续命令可以通过RBatch对象在一次网络会话请求里合并发送,这样省去了产生多个请求消耗的时间和资源。这在Redis中叫做管道

用户可以通过以下方式调整通过管道方式发送命令的方式:

  1. BatchOptions options = BatchOptions.defaults()
  2. // 指定执行模式
  3. //
  4. // ExecutionMode.REDIS_READ_ATOMIC - 所有命令缓存在Redis节点中,以原子性事务的方式执行。
  5. //
  6. // ExecutionMode.REDIS_WRITE_ATOMIC - 所有命令缓存在Redis节点中,以原子性事务的方式执行。
  7. //
  8. // ExecutionMode.IN_MEMORY - 所有命令缓存在Redisson本机内存中统一发送,但逐一执行(非事务)。默认模式。
  9. //
  10. // ExecutionMode.IN_MEMORY_ATOMIC - 所有命令缓存在Redisson本机内存中统一发送,并以原子性事务的方式执行。
  11. //
  12. .executionMode(ExecutionMode.IN_MEMORY)
  13. // 告知Redis不用返回结果(可以减少网络用量)
  14. .skipResult()
  15. // 将写入操作同步到从节点
  16. // 同步到2个从节点,等待时间为1秒钟
  17. .syncSlaves(2, 1, TimeUnit.SECONDS)
  18. // 处理结果超时为2秒钟
  19. .responseTimeout(2, TimeUnit.SECONDS)
  20. // 命令重试等待间隔时间为2秒钟
  21. .retryInterval(2, TimeUnit.SECONDS);
  22. // 命令重试次数。仅适用于未发送成功的命令
  23. .retryAttempts(4);

使用方式如下:

  1. RBatch batch = redisson.createBatch();
  2. batch.getMap("test").fastPutAsync("1", "2");
  3. batch.getMap("test").fastPutAsync("2", "3");
  4. batch.getMap("test").putAsync("2", "5");
  5. batch.getAtomicLongAsync("counter").incrementAndGetAsync();
  6. batch.getAtomicLongAsync("counter").incrementAndGetAsync();
  7. BatchResult res = batch.execute();
  8. // 或者
  9. Future<BatchResult> asyncRes = batch.executeAsync();
  10. List<?> response = res.getResponses();
  11. res.getSyncedSlaves();

在集群模式下,所有的命令会按各个槽所在的节点,筛选分配到各个节点并同时发送。每个节点返回的结果将会汇总到最终的结果列表里。