资讯专栏INFORMATION COLUMN

Redis批量执行(如list批量添加)命令工具 —— pipeline管道应用

WelliJhon / 2675人阅读

摘要:服务端处理命令,并将结果返回给客户端。这样的连接可能非常快在一个回路网络中,也可能非常慢在广域网上经过多个结点才能互通的两个主机。

前言

Redis使用的是客户端-服务器(CS)模型和请求/响应协议的TCP服务器。这意味着通常情况下一个请求会遵循以下步骤:

(1)客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
(2)服务端处理命令,并将结果返回给客户端。

客户端和服务端通过网络进行连接。这样的连接可能非常快(在一个回路网络中),也可能非常慢(在广域网上经过多个结点才能互通的两个主机)。

但是无论是否存在网络延迟,数据包从客户端传输到服务端,以及客户端从服务端获得响应都需要花费一些时间。这段时间就称为往返时延(Round Trip Time)。

因此当客户端需要执行一串请求的时候,很容易看出它对性能的影响(例如往同一个队列中加入大量元素,或者往数据库中插入大量的键)。如果RTT时长为250毫秒(在基于广域网的低速连接环境下),即使服务器每秒可以处理10万个请求,但是实际上我们依然只能每秒处理最多4个请求。

如果处于一个回路网络中,RTT时长则相当短(我的主机ping 127.0.0.1时只需要0.063ms),但是如果你执行一大串写入请求的时候,还是会有点长。

如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,由redis服务器依次执行,并返回结果。

为了解决此类问题,设计者设计出了redis管道命令:客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复返回给客户端,从而大大增加了协议性能。

pipeline在php中的应用

管道的开启方式最主要是一条命令:$redis->pipeline()

批量给一个list类型的key添加10w条数据,实例如下:

connect("127.0.0.1", 6379);
   $redis->auth("******");
   $redis->select(0);
   $redis->pipeline();//开启管道
   
   //假设变量$data数组有10w条数据,批量添加到list类型中
   $data = array(1,2,3,...,100000);
   $key = "list1";
   foreach($data as $value){
       $redis->rpush($key,$value);
   }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29596.html

相关文章

  • 使用Redis管道提升性能

    摘要:首发于樊浩柏科学院的管道是用来打包多条无关命令批量执行,以减少多个命令分别执行带来的网络交互时间。在一些批量操作数据的场景,使用管道可以显著提升的读写性能。这时,可以使用管道实现,也可以内嵌脚本实现。 首发于 樊浩柏科学院 Redis 的 管道 (pipelining)是用来打包多条无关命令批量执行,以减少多个命令分别执行带来的网络交互时间。在一些批量操作数据的场景,使用管道可以显著...

    rickchen 评论0 收藏0
  • 使用python来操作redis用法详解

    摘要:连接提供两个类和用于实现的命令,用于实现大部分官方的命令,并使用官方的语法和命令,是的子类,用于向后兼容旧版本的。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。 1、redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用...

    Corwien 评论0 收藏0

发表评论

0条评论

WelliJhon

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<