一、pipeline出现背景:
redis客户端执行命令4个过程:发送命令-〉命令排队-〉命令执行-〉返回结果
过程称为Round trip time(简称RTT, 往返时间),mget mset有效节约RTT,但大部分命令(如hgetall,并没有mhgetall)不支持批量操作,需要消耗N次RTT ,pipeline解决
![](https://img.haomeiwen.com/i9930763/845ed241cc64fb79.png)
二、pepeline性能
比逐条执行要快,特别是客户端与服务端的网络延迟越大,体能越明显
![](https://img.haomeiwen.com/i9930763/966114c06418e5d1.png)
![](https://img.haomeiwen.com/i9930763/72a73b4f1751aa1f.png)
三、原生批命令(mset, mget)与Pipeline对比
原生批命令:原子性, pipeline:非原子性
原生批命令:一命令多个key pipeline:支持多命令(存在事务)
原生批命令:服务端实现, pipeline:服务端与客户端共同完成
四、Pipeline正确使用方式
pipeline组装命令不能太多,不然数据量过大,增加客户端的等待时间,造成网络阻塞,可将大量命令的拆分多个小pipeline命令:
1、Jedis中的pipeline使用方式
redis提供mset、mget方法,但没提供mdel方法,如想实现,可借助pipeline
mset:同时设置一个或多个 key-value 对。redis 127.0.0.1:6379> MSET key1 value1 key2 value2 .. keyN valueN
2、Jedis中的pipeline使用步骤:
1)获取jedis对象(一般从连接池中获取)
2)获取jedis对象的pipeline对象
3)添加、执行指令
![](https://img.haomeiwen.com/i9930763/0677e8e48cd55501.png)
![](https://img.haomeiwen.com/i9930763/e1a418e605f5c62d.png)
用pipeline提交所有操作并返回执行结果:
![](https://img.haomeiwen.com/i9930763/da44cf2d75056c4e.png)
五、redis事务
为了保证pipeline原子性,redis提供了简单的事务。
1、redis的简单事务:放multi和exec命令之间,multi代表事务开始,exec代表事务结束
![](https://img.haomeiwen.com/i9930763/154e439aa41ab879.png)
2、停止事务discard:
![](https://img.haomeiwen.com/i9930763/7ec8419de65cf390.png)
3、命令错误,语法不正确,导致事务不能正常结束
![](https://img.haomeiwen.com/i9930763/401688c059fd2b8d.png)
4、运行错误,语法正确,但类型错误,事务可以正常结束
![](https://img.haomeiwen.com/i9930763/15f231822f24be87.png)
5、watch命令:用watch后, multi失效,事务失效
![](https://img.haomeiwen.com/i9930763/7fa5826fad5b05b3.png)
WATCH机制:事务EXEC执行时,Redis检查被WATCH的key,只有被WATCH的key从WATCH起始时至今没有发生过变更,EXEC才会被执行,变化则失败。
小结:redis提供简单事务,不支持事务回滚
网友评论