管道概述
Q:什么是管道?
一种通过一次发出多个命令而无需等待每个命令响应的技术,其目是用来提高 Redis 的性能。在官方网站上会有更多的信息可以参阅—— https://redis.io/docs/manual/pipelining/
# 比如我要存放 3 个 KV 对,如果使用 set 命令,需要交互三次
192.168.100.3:6379[2]> set k1 v1
OK
192.168.100.3:6379[2]> set k2 v2
OK
192.168.100.3:6379[2]> set k3 v3
OK
# 但如果你使用 mset 命令,则只需要交互一次
192.168.100.3:6379[2]> mset nk1 nv1 nk2 nv2 nk2 nk3 nv3
Redis 是一种使用 client-server 模型的 TCP 服务器,即所谓的 请求/响应 协议。一个请求通常需要以下步骤完成:
- 客户端发送命令请求,并从 socket 读取,这通常会以阻塞的方式获取服务器的响应。
- 服务器处理该命令并将响应返回给客户端
客户端与服务器通过网络进行连接,连接的速度可以非常快(比如回环网卡),也可以非常慢(通过公网建立的连接,两台机器之间有很多的跃点)。无论网络延迟是多少,数据包从客户端传输到服务器并从服务器返回到客户端都需要时间,这个时间被称为 RTT(往返时间,Round Trip Time)。当客户端需要连续发送多个命令请求时,RTT 非常影响性能,例如,虽然 Redis 可以处理 10w/s 的请求,但当 RTT 为 250 毫秒时,每秒也只能最多处理 4 个请求。不仅仅是 RTT 问题,在不使用管道的情况下,多次命令交互还频繁调用系统 IO、read()、write()等等,所以 Redis 引入了管道技术来解决这些性能问题,即可以一次性将多条命令发给服务器,服务器处理完毕后,只需要通过一条响应便能将结果返回。本质上,管道其实也就是命令队列,也具有 FIFO (先进先出)特性
管道的使用
您需要首先将相关的 Redis 命令写入到文本文件中,然后使用 redis-cli
命令调用该文件。 redis-cli
命令的选项如下:
Shell > redis-cli --help
...
--pipe Transfer raw Redis protocol from stdin to server.
--pipe-timeout <n> In --pipe mode, abort with error if after sending all data.
no reply is received within <n> seconds.
Default timeout: 30. Use 0 to wait forever.
...
使用的样例如下:
# 使用 2 号 DB,并且添加三种数据类型的数据
Shell > vim /tmp/set.txt
select 2
zadd game:player:score 60 jace 90 jade 100 allen
zadd game:player:score XX 80 jace
mset one value1 two value2
hset user:1 name david age 30
Shell > cat /tmp/set.txt | /usr/local/redis/bin/redis-cli -h 192.168.100.3 -p 6379 -a "MyPassword" --pipe --pipe-timeout 30
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 5
Shell > /usr/local/redis/bin/redis-cli -h 192.168.100.3 -p 6379 -a MyPassword
192.168.100.3:6379> select 2
OK
192.168.100.3:6379[2]> type one
string
192.168.100.3:6379[2]> type two
string
192.168.100.3:6379[2]> type game:player:score
zset
192.168.100.3:6379[2]> type user:1
hash
管道的优缺点
优点:
- 解决了以 RTT 为主和多次命令交互带来的性能损耗问题
缺点:
- 没有原子性
- 单个文本文件不宜写入太多命令,否则排队会占用更多的内存以及等待响应的时间过长,比如您有 2w 的命令行数,官方建议你分两次处理,即 1w 一个文本文件
管道与事务的对比
原子性 | 排队机制 | 排它性 | 使用方式 | 作用 | |
---|---|---|---|---|---|
事务 | 部分拥有 | √ | 独占排它性 | 主要围绕着 MULTI、EXEC、DISCARD、WATCH 等命令展开 | 允许您在单个步骤中执行一组命令 |
管道 | × | √ | × | 将命令写入到纯文本文件中并使用 redis-cli 进行调用 | 解决了以 RTT 为主和多次命令交互带来的性能损耗问题 |
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论