Redis 实用技术——Pipeline
引言
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。
这意味着通常情况下一个请求会遵循以下步骤:
- 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
- 服务端处理命令,并将结果返回给客户端。
因此,例如下面是4个命令序列执行情况:
- Client: INCR X
- Server: 1
- Client: INCR X
- Server: 2
- Client: INCR X
- Server: 3
- Client: INCR X
- Server: 4
RTT (Round Trip Time - 往返时间). 当客户端需要在一个批处理中执行多次请求时很容易看到这是如何影响性能的(例如添加许多元素到同一个list,或者用很多Keys填充数据库)。
例如,如果RTT时间是250毫秒(在一个很慢的连接下),即使服务器每秒能处理100k的请求数,我们每秒最多也只能处理4个请求。
一、Redis 管道(Pipelining)
服务器能实现即使旧的请求还未被响应,新的请求也可以被处理,这就是管道的含义。它是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。
Redis很早就支持管道(pipelining)技术,因此无论你运行的是什么版本,你都可以使用管道(pipelining)操作Redis。
例如:
$ (printf "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379
+PONG
+PONG
+PONG
非常明确的,用管道顺序操作的第一个例子如下:
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
注意:使用管道发送命令时,务器将被迫回复一个队列答复,占用很多内存。
所以,如果你需要发送大量的命令,最好是把他们按照合理数量分批次的处理,例如10K的命令,读回复,然后再发送另一个10k的命令,等等。这样速度几乎是相同的,但是在回复这10k命令队列需要非常大量的内存用来组织返回数据内容。
Redis 实用技术——Pipeline相关推荐
- Redis 学习 - 05 Node.js 客户端操作 Redis、Pipeline 流水线
使用编程语言客户端操作 Redis 目前我们进行的操作都是通过 Redis 的命令行客户端 redis-cli 进行的. 开发者也可以通过 Redis 图形管理软件操作,例如 RDM(Redis De ...
- 分布式缓存Redis之Pipeline(管道)
Pipeline,你土味一点你把它翻译成一条龙服务 专业一点,叫它综合解决方案,就行. 算法或者大数据分析里的 可重复使用,针对新的数据,直接输入数据,可以得到结果. 一个典型的机器学习构建包含若干个 ...
- redis通过pipeline提升吞吐量
案例目标 简单介绍 redis pipeline 的机制,结合一段实例说明pipeline 在提升吞吐量方面发生的效用. 案例背景 应用系统在数据推送或事件处理过程中,往往出现数据流经过多个网元: 然 ...
- redis管道pipeline的运用
Redis使用的是客户端-服务器(CS)模型和请求/响应协议的TCP服务器.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服 ...
- Redis之Pipeline(管道)
1.Pipeline定义 管道(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline 通过减少客户端与 redis 的通信次数来实现降低往返延时时间,而且 Pipel ...
- php读取文件使用redis的pipeline导入大批量数据
第一次写博客,哈哈,纯属用来记录一下自己工作中遇到的问题及解决办法. 昨天因为工作的需求,需要做一个后台上传TXT文件,读取其中的内容,然后导入redis库中.要求速度快,并且支持至少10W以上的数据 ...
- java redis 流水线_Redis附加功能之Redis流水线pipeline
流水线功能的目的:通过减少客户端与服务器之间的通信次数来提高程序的执行效率. 一.通信 在一般情况下, 用户每执行一个 Redis 命令,客户端与服务器都需要进行一次通信:客户端会将命令请求发送给服务 ...
- mysql 分批提交_spark dataframe 数据批量写入 redis(pipeline、分批提交)
使用 python 的 spark 模块,即 pyspark,通过 spark sql 从 hive 或 mysql 等存储层读取相关数据,对应 spark 的 dataframe 对象,经过一系列的 ...
- Redis 实用技术——事务
引言 redis的事务不像关系型数据库的事务那样完整. "快"是redis的特征,在事务管理的过程中,使用muti命令开启事务块,当输入多条命令后,再使用exec命令执行事务块中的 ...
最新文章
- [新手必看] 17个常见的Python运行时错误
- Hibernate.Annotation注解
- Acwing第 18 场周赛【完结】
- 解题报告 『[NOI2014]起床困难综合症』
- Navicate Premium连接Oracle数据库报错
- LOJ#2230. 「BJOI2014」大融合
- ES6——函数参数默认值
- Ubuntu20.04 安装matlab2017b
- 智能合约审计之整形溢出攻击
- ubuntu下使用笔记本摄像头
- 关于Unable to read additional data from server sessionid 0x0问题的解决。
- VMware Explore 2022 China,赋能中国企业加速实现云智能
- 调整计算机繁体,在线繁体转换
- c语言recy未定义标识符,求解这个C语言子程序什么意思
- flutter上分之路1-新手教学(配置安装)
- 游戏:杀戮尖塔(Slay the spire)mod--拉格朗·月
- TeXworks 使用教程
- 国际空间站ISS SSTV 2018 OCT
- 命令行模式下运行js文件
- SpringBoot 分片上传、断点续传、秒传、直传Minio
热门文章
- vector cbegin_vector :: cbegin()函数以及C ++ STL中的示例
- 分布式映射与集中式映射_K映射上的表达式映射和组包围
- 2万字!66道并发面试题及答案
- 面试官:使用SpringBoot如何开发邮件发送系统?
- ReactNative常用组件汇总
- python ping利用线程池获取在线设备
- 【博主推荐】Python 基于Xlwings、Openpyxl自己重新封装Python操作Excel类
- Supervisor管理springboot应用进程
- html和css如何制作小球,[网页设计]使用CSS3动画模拟实现小球自由落体效果
- IE浏览器怎么清理缓存