Redis进阶篇03 — 管道

管道概述

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 为主和多次命令交互带来的性能损耗问题
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇