redis管道pipeline的运用
Redis使用的是客户端-服务器(CS)模型和请求/响应协议的TCP服务器。这意味着通常情况下一个请求会遵循以下步骤:
- 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
- 服务端处理命令,并将结果返回给客户端。
普通模式与管道模式
分析
普通模式:由于通信会有网络延迟,假如client和server之间的包传输时间需要0.125秒。那么上面的三个命令6个报文至少需要0.75秒才能完成。这样即使redis每秒能处理100个命令,而我们的client也只能一秒钟发出四个命令。这显然没有充分利用 redis的处理能力。
- 管道模式:(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline通过减少客户端与redis的通信次数来实现降低往返延时时间,而且Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。 Pipeline 的默认的同步的个数为53个,也就是说arges中累加到53条数据时会把数据提交。其过程如下图所示:client可以将三个命令放到一个tcp报文一起发送,server则可以将三条命令的处理结果放到一个tcp报文返回。
需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令越多越好。具体多少合适需要根据具体情况测试。
案例一:将100万条数据写入redis
//产生100万条数据到指定文件
declare(strict_types=1);//开启强类型模式function random($length, $numeric = false)
{$seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);$seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));if ($numeric) {$hash = '';} else {$hash = chr(rand(1, 26) + rand(0, 1) * 32 + 64);$length--;}$max = strlen($seed) - 1;for ($i = 0; $i < $length; $i++) {$hash .= $seed{mt_rand(0, $max)};}return $hash;
}$filePath = './data.txt';
for ($i = 0; $i <= 1000000; $i++) {$str = random(10, true);file_put_contents($filePath, $str . PHP_EOL, FILE_APPEND);
}
//读取数据通过管道方式写入到redis
$lines = file_get_contents($filePath);//获取文件内容
ini_set('memory_limit', '-1');//不要限制Mem大小,否则会报错$arr = explode(PHP_EOL, $lines);//转换成数组//echo $arr['1000000'] ?? 'null';try {$redis = new \Redis();$redis->connect('192.168.1.9', 6379);$redis->auth('*****');//密码验证$redis->select(0);//选择库$redis->pipeline();//开启管道foreach ($arr as $key => $value) {$redis->hsetNx('helloworld', (string)$key, $value);}$redis->exec();echo $redis->hGet('helloworld', '1000000') . PHP_EOL;echo $redis->hGet('helloworld', '1000001') . PHP_EOL;
} catch (\Exception $e) {echo $e->getMessage();
}
案例二:通过管道批量设置与读取
//批量设置
try {$redis = new \Redis();$redis->connect('192.168.1.9', 6379);$redis->auth('******');$redis->select(0);$redis->pipeline();//开启管道$redis->set('str1', 'h');$redis->set('str2', 'e');$redis->set('str3', 'l');$redis->set('str4', 'l');$redis->set('str5', 'o');$redis->set('str6', 'w');$redis->set('str7', 'o');$redis->set('str8', 'r');$redis->set('str9', 'l');$redis->set('str10', 'd');$result = $redis->exec();print_r($result);
} catch (\Exception $e) {echo $e->getMessage();
}结果:
Array
([0] => 1[1] => 1[2] => 1[3] => 1[4] => 1[5] => 1[6] => 1[7] => 1[8] => 1[9] => 1
)
//批量读取
try {$redis = new \Redis();$redis->connect('192.168.1.9', 6379);$redis->auth('******');$redis->select(0);$redis->pipeline();//开启管道$redis->get('str1');$redis->get('str2');$redis->get('str3');$redis->get('str4');$redis->get('str5');$redis->get('str6');$redis->get('str7');$redis->get('str8');$redis->get('str9');$redis->get('str10');$result = $redis->exec();print_r($result);
} catch (\Exception $e) {echo $e->getMessage();
}结果:
Array
([0] => h[1] => e[2] => l[3] => l[4] => o[5] => w[6] => o[7] => r[8] => l[9] => d
)
来源:http://blog.51cto.com/phpme/2136827?source=dra
redis管道pipeline的运用相关推荐
- Redis管道(Pipeline)详解
在讲解管道前,我们首先来了解一下redis的交互,redis的一次交互是由客户端发起,由服务端接收,那么我们连续操作一些指令,如下图所示: 客户端请求一个指令到服务器到服务器返回数据这个过程非常复杂, ...
- python redis pipeline使用方法_Redis中的管道Pipeline操作
点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 点击右侧关注,大数据开发领域最强公众号! 点击右侧关注,暴走大数据! Redis默认每次执行请求都 ...
- Redis的管道pipeline
本文来说下Redis的管道pipeline 文章目录 概述 Redis管道技术 SpringDataRedis使用管道 使用管道技术的注意事项 本文小结 概述 Redis提供了一个称为管道(Pipel ...
- 分布式缓存Redis之Pipeline(管道)
Pipeline,你土味一点你把它翻译成一条龙服务 专业一点,叫它综合解决方案,就行. 算法或者大数据分析里的 可重复使用,针对新的数据,直接输入数据,可以得到结果. 一个典型的机器学习构建包含若干个 ...
- php redis 管道技术,Redis管道技术这么厉害,你都用对了吗
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...
- PHP中Redis管道
Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户 ...
- Redis 学习 - 05 Node.js 客户端操作 Redis、Pipeline 流水线
使用编程语言客户端操作 Redis 目前我们进行的操作都是通过 Redis 的命令行客户端 redis-cli 进行的. 开发者也可以通过 Redis 图形管理软件操作,例如 RDM(Redis De ...
- Redis管道Pipelining原理详解
请求/响应协议和RTT Redis是一种基于客户端-服务端模型及请求/响应协议的TCP服务. 这意味着一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常以阻塞模式, ...
- 9.Redis 管道(pipe mode)
Redis 2.6 开始 redis-cli 支持一种新的被称之为 pipe mode(管道)的新模式用于大量数据插入工作. Redis 中的管道技术是指:Redis Pipelining,用于提高 ...
最新文章
- 聚类(中)层次聚类 基于密度的聚类算法
- img文件编辑_只会用chmod 777?Linux下的文件权限居然还有这么多骚操作
- (组合数学笔记)Pólya计数理论_Part.7_Pólya定理的母函数形式
- python @cached_property
- 性能优化 - 之一 (C/C++)
- 液晶显示屏怎么显示泰文_什么是LCD液晶显示屏
- 通过 微软 pai-fs 上传数据到HDFS (Microsoft OpenPAI)
- Spring Boot 2.x 注册 Servlet 三大组件 Servlet、Filter、Listener
- dede使用方法---用js让当前导航高亮显示
- php7 imagick扩展,php7如何安装imagick扩展
- java中Field中的方法,解析Java中的Field类和Method类
- Java实现手机号邮箱号登录_手机号、邮箱或者用户名登录的实现方法
- CKEditor与CKFinder学习--安全的使用CKFinder与权限控制
- 基本面分析 ≠ 基本面量化投资?
- OA系统十九:请假申请五:【请假申请】这个内嵌页面的前台文件;设置【点击左侧菜单栏的“请假申请”后】在首页的“功能区”显示【请假功能】这个内嵌页面;
- 程序员如何优雅的赚零花钱?分享几个接私活的平台利器
- mysql数据库网课_中国大学MOOCMysql数据库系统网课答案
- 开源量化框架Catalyst中文教程(3)——双均线策略
- linux ftok函数
- 智能运维监控管理平台技术方案
热门文章
- html5列表标签代码,HTML5列表标签和表格标签(示例代码)
- 计算机统计字符数,如何在Word中统计相同字符(文字)出现的个数 -电脑资料
- php 需要已安装且正在运行的邮件系统_php如何发送邮件?一个函数轻松搞定
- 26.27.28.29.极区图(南丁格尔玫瑰图)、维恩图 (Venn diagram)、面状图(Area chart)、树地图
- HDP安全之集成kerberos/LDAP、ranger;安装部署kerberos;安装Knox;安装LDAP;启动LDAP;验证Knox网关
- 拷贝构造,操作符重载
- 韵镖侠登录不上 显示无法连接到服务器,什么是韵镖侠?韵镖侠是做什么的?...
- python3默认编码_python3的url编码和解码,自定义gbk、utf-8的例子
- 在Windows下搭QT编程环境
- 程序设计中的驼峰原则