摘要:服务端处理命令,并将结果返回给客户端。这样的连接可能非常快在一个回路网络中,也可能非常慢在广域网上经过多个结点才能互通的两个主机。
前言
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 的 管道 (pipelining)是用来打包多条无关命令批量执行,以减少多个命令分别执行带来的网络交互时间。在一些批量操作数据的场景,使用管道可以显著...
摘要:连接提供两个类和用于实现的命令,用于实现大部分官方的命令,并使用官方的语法和命令,是的子类,用于向后兼容旧版本的。如果使用关系数据库来存储点击,可能存在大量的行级锁争用。 1、redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用...
阅读 1223·2023-04-25 18:57
阅读 2069·2023-04-25 16:28
阅读 3893·2021-11-24 09:39
阅读 3599·2021-11-16 11:45
阅读 1791·2021-10-13 09:40
阅读 1234·2019-08-30 15:52
阅读 1693·2019-08-30 10:57
阅读 572·2019-08-29 16:55