Redis - 管道批量写入数据

前言

众所周知 Redis 是一种基于 C/S 架构的高速缓存服务,基于 TCP 协议进行请求和响应。所以每次客户端发起一个请求,监听 Socket 并等待服务端的响应,服务端处理并响应给客户端。
这个过程中产生的时间称之为 RTT(Round Trip Time - 往返时间),如批量写入数据这种情况,每次进行一次请求响应,那这个时间开销将是灾难性的。

好在 Redis 在很早的版本就支持管道(pipelining)这种技术,在类型批量情况下会有极大的好处。

管道(pipelining)

管道并非 Redis 特有,在 Redis 中运用管道的目的是解决多次请求带来的性能问题(如需要写大量的数据到 Redis 中)。
管道可以实现客户端无需等待服务端的响应继续请求服务端,在最后得到响应。

当使用管道发生命令时候,Redis 服务端会使用一个队列来存储响应。所以为了避免使用过多的内存,可以将命令集切割成多次请求。

性能测试

测试目的:
测试使用管道和不使用管道下,将三百万多条数据写入 Redis 的用时对比。

测试对象:

  1. 文件存储了 3592666 条数据,文件大小大约为 164M 。内容基本类似:
set rta_00000000000000000860173040670378 30
  1. 使用管道需要将文件内容转化为 Redis 报文格式(RESP), 关于 RESP 可查阅博文《Redis - 通信协议RESP(附自写 redis 客户端)》。如下所示:
*3
$3
SET
$7
library
$7
library

测试环境:
电脑:Mac mini 16G
Redis 版本:3.2.9

RDB:开启
save 900 1
save 300 10
save 60 10000

AOF:未开启

测试结果:
keys.log 文件中每行如: set rta_00000000000000000860173040670378 30
resp.log 文件中为 resp 报文格式

是否使用管道测试用例备注用时
cat keys.log | redis-cli直接将 set 命令写入redis2m30s
cat resp.log | redis-cli --pipe使用 --pipe 参数代表使用通道8.3s

总结和注意

  1. 相较于普通模式,使用通道实现多命令请求的效率是很高的。
  2. 当单次写入的命令过多,尽管使用通道也要进行拆分多次。避免响应队列过长占用过多的内存。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mooddance

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值