Redis学习笔记(三):pipeline

背景

redis客户端执行一条命令分4个过程:

发送命令 -> 命令排队 -> 命令执行 -> 返回结果

这个过程称为Round trip time(简称RTT, 往返时间),mget mset有效节约了RTT,但大部分命令(如hgetall,并没有mhgetall)不支持批量操作,需要消耗N次RTT ,这个时候需要pipeline来解决这个问题

Jedis测试

Jedis jedis = new Jedis();
long start = System.currentTimeMillis();
Pipeline pipelined = jedis.pipelined();
for (int i = 0; i < 10000; i++) {
    pipelined.set("key:" + i, "value" + i);
}
pipelined.sync();
long pause = System.currentTimeMillis();
System.out.println((pause - start) + "ms");
for (int i = 0; i < 10000; i++) {
    jedis.set("key:" + (i << 1), "value" + i);
}
long end = System.currentTimeMillis();
System.out.println((end - pause) + "ms");

结果大概是

73ms
279ms

总结

  1. 为什么要pipeline?

    避免多条命令发送造成的性能浪费,尤其是客户端与服务端的网络延迟越大,pipeline优势越明显。

  2. pipeline是原子性的吗?

    不是,但mgetmset是。

  3. 与原生批命令的对比?

    1. 原生批命令是原子性,pipeline是非原子性

    2. 原生批命令一命令多个key, 但pipeline支持多命令(存在事务),非原子性

    3. 原生批命令是服务端实现,而pipeline需要服务端与客户端共同完成

参考

  1. Redis系列十:Pipeline详解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值