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的运用相关推荐

  1. Redis管道(Pipeline)详解

    在讲解管道前,我们首先来了解一下redis的交互,redis的一次交互是由客户端发起,由服务端接收,那么我们连续操作一些指令,如下图所示: 客户端请求一个指令到服务器到服务器返回数据这个过程非常复杂, ...

  2. python redis pipeline使用方法_Redis中的管道Pipeline操作

    点击上方蓝色字体,选择"设为星标" 回复"资源"获取更多资源 点击右侧关注,大数据开发领域最强公众号! 点击右侧关注,暴走大数据! Redis默认每次执行请求都 ...

  3. Redis的管道pipeline

    本文来说下Redis的管道pipeline 文章目录 概述 Redis管道技术 SpringDataRedis使用管道 使用管道技术的注意事项 本文小结 概述 Redis提供了一个称为管道(Pipel ...

  4. 分布式缓存Redis之Pipeline(管道)

    Pipeline,你土味一点你把它翻译成一条龙服务 专业一点,叫它综合解决方案,就行. 算法或者大数据分析里的 可重复使用,针对新的数据,直接输入数据,可以得到结果. 一个典型的机器学习构建包含若干个 ...

  5. php redis 管道技术,Redis管道技术这么厉害,你都用对了吗

    Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响 ...

  6. PHP中Redis管道

    Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命令并将响应发送回客户 ...

  7. Redis 学习 - 05 Node.js 客户端操作 Redis、Pipeline 流水线

    使用编程语言客户端操作 Redis 目前我们进行的操作都是通过 Redis 的命令行客户端 redis-cli 进行的. 开发者也可以通过 Redis 图形管理软件操作,例如 RDM(Redis De ...

  8. Redis管道Pipelining原理详解

    请求/响应协议和RTT Redis是一种基于客户端-服务端模型及请求/响应协议的TCP服务. 这意味着一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常以阻塞模式, ...

  9. 9.Redis 管道(pipe mode)

    Redis 2.6 开始 redis-cli 支持一种新的被称之为 pipe mode(管道)的新模式用于大量数据插入工作. Redis 中的管道技术是指:Redis Pipelining,用于提高 ...

最新文章

  1. 聚类(中)层次聚类 基于密度的聚类算法
  2. img文件编辑_只会用chmod 777?Linux下的文件权限居然还有这么多骚操作
  3. (组合数学笔记)Pólya计数理论_Part.7_Pólya定理的母函数形式
  4. python @cached_property
  5. 性能优化 - 之一 (C/C++)
  6. 液晶显示屏怎么显示泰文_什么是LCD液晶显示屏
  7. 通过 微软 pai-fs 上传数据到HDFS (Microsoft OpenPAI)
  8. Spring Boot 2.x 注册 Servlet 三大组件 Servlet、Filter、Listener
  9. dede使用方法---用js让当前导航高亮显示
  10. php7 imagick扩展,php7如何安装imagick扩展
  11. java中Field中的方法,解析Java中的Field类和Method类
  12. Java实现手机号邮箱号登录_手机号、邮箱或者用户名登录的实现方法
  13. CKEditor与CKFinder学习--安全的使用CKFinder与权限控制
  14. 基本面分析 ≠ 基本面量化投资?
  15. OA系统十九:请假申请五:【请假申请】这个内嵌页面的前台文件;设置【点击左侧菜单栏的“请假申请”后】在首页的“功能区”显示【请假功能】这个内嵌页面;
  16. 程序员如何优雅的赚零花钱?分享几个接私活的平台利器
  17. mysql数据库网课_中国大学MOOCMysql数据库系统网课答案
  18. 开源量化框架Catalyst中文教程(3)——双均线策略
  19. linux ftok函数
  20. 智能运维监控管理平台技术方案

热门文章

  1. html5列表标签代码,HTML5列表标签和表格标签(示例代码)
  2. 计算机统计字符数,如何在Word中统计相同字符(文字)出现的个数 -电脑资料
  3. php 需要已安装且正在运行的邮件系统_php如何发送邮件?一个函数轻松搞定
  4. 26.27.28.29.极区图(南丁格尔玫瑰图)、维恩图 (Venn diagram)、面状图(Area chart)、树地图
  5. HDP安全之集成kerberos/LDAP、ranger;安装部署kerberos;安装Knox;安装LDAP;启动LDAP;验证Knox网关
  6. 拷贝构造,操作符重载
  7. 韵镖侠登录不上 显示无法连接到服务器,什么是韵镖侠?韵镖侠是做什么的?...
  8. python3默认编码_python3的url编码和解码,自定义gbk、utf-8的例子
  9. 在Windows下搭QT编程环境
  10. 程序设计中的驼峰原则