• 10.3. 命令的批量执行

    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();

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