如何使用redis的pipeline来提升效率
mhr18 2024-12-05 13:41 17 浏览 0 评论
作者 / 以码为梯
排版 / 以码为梯
文章字数 / 1357
阅读时长 / 5分钟
希望大家可以关注我[机智]
Redis 客户端和服务器使用基于 TCP 的称为 RESP(REdis Serialization Protocol )的协议相互通信 ,在基于 TCP 的协议中,服务器和客户端通过请求/响应模型进行通信 。Redis 也是同样的工作方式,客户端发送请求,服务器处理命令,客户端以阻塞的方式等待响应 。
执行命令时,客户端发送命令到服务端,服务端执行完命令之后将结果返回到客户端。这个过程有以下步骤:
- 客户端发送命令到服务器
- 服务端对命令进行处理并得到结果
- 服务端将处理结果返回给客户端
- 客户端得到服务端响应继续后续请求或者重复步骤1
以上步骤中第一步和第三步因为网络传输所消耗的时间被称为RTT(Round Trip Time),而这个时间就是影响redis执行效率的因素之一。
假设RTT的时间为250ms,即使服务器能够支撑10万次/秒的请求,1秒能够执行的命令只有4个。
在第二步骤中因为Linux架构的原因,每次执行命令会调用read() 函数将指令从用户空间读取到内核空间并在执行完成之后调用write()将结果从内核空间写入到用户空间,这里的上下文切换是对执行速度的第二因素。
针对以上两点因素,Redis提供了pipeline功能,支持一次性发送多个命令,通过减少网络传输的次数的方式来减少网络传输的耗时以及上下文切换的时间。
通过抓包工具tcpdump可以看到使用pipeline之后传输的命令的变化。
pipeline对速度的提升有多大?
以下代码展示了10万条命令的执行情况,使用了pipeline比没有使用pipeline速度有明显提升。
在我的电脑上的执行结果为:不使用pipeline执行10万条命令的时间为24578ms,使用了pipeline执行10万条命令的时间为551ms。
测试执行结果
需要注意的是在使用pipeline发送命令时,不能一次性发送过多的命令,原因主要有以下两个:
- redis服务端使用队列来存放需要执行的命令,过多的命令会对内存有所影响。
- 客户端缓存太多的命令会增加耗时而且太多的命令也会给网络传输造成一定的影响。
可以采用分批执行的方式来避免占用过多内存,例如存在100万条命令,可以分10次每次执行10万条来执行。
Pipeline是原子的(atomic)吗
使用pipeline发送多条命令时,这些命令不是原子的。也就是说在多线程下使用pipeline批量执行命令时,多个线程执行的命令有可能会穿插执行,如果需要单个线程的命令不受其他线程命令影响则需要使用Redis的事务。
我们可以通过下面的例子来演示下:
创建两个线程,一个线程用于以pipeline的方式发送10万条incr命令,另一个线程向redis发送get命令。假设pipeline是原子性的,那么这个get名只会返回100000,否则则会返回多个中间值。
上面的例子的返回结果如下:
从上图中可以看到,在返回100000之前返回了很多中间值,这就说明以pipeline发送多条命令并不能保证这些命令的原子性。那么要想保证多个命令的原子性我们该怎么实现?
如何保证pipeline的原子性?
这就需要用到Redis的事务特性了,在多个命令之前增加multi命令,并在执行时使用exec来执行。那么我们对上面的incr方法略作修改,加上multi和exec就可以保证批量命令的原子性。
在修改之后,代码执行的结果如下:
可以看到返回结果直接就是100000,说明这是等所有incr命令都执行完之后才执行的get命令。
所以从本文可以看出pipeline只是用于节省网络传输的时间,如果需要保证命令的原子性还是需要使用redis的事务特性。
你的点赞评论是我最大的动力
相关推荐
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
- 备份软件调用rman接口备份报错RMAN-06820 ORA-17629 ORA-17627
-
一、报错描述:备份归档报错无法连接主库进行归档,监听问题12541RMAN-06820:WARNING:failedtoarchivecurrentlogatprimarydatab...
- 增量备份修复物理备库gap(增量备份恢复数据库步骤)
-
适用场景:主备不同步,主库归档日志已删除且无备份.解决方案:主库增量备份修复dg备库中的gap.具体步骤:1、停止同步>alterdatabaserecovermanagedstand...
- 一分钟看懂,如何白嫖sql工具(白嫖数据库)
-
如何白嫖sql工具?1分钟看懂。今天分享一个免费的sql工具,毕竟现在比较火的NavicatDbeaverDatagrip都需要付费才能使用完整功能。幸亏今天有了这款SQLynx,它不仅支持国内外...
- 「开源资讯」数据管理与可视化分析平台,DataGear 1.6.1 发布
-
前言数据齿轮(DataGear)是一款数据库管理系统,使用Java语言开发,采用浏览器/服务器架构,以数据管理为核心功能,支持多种数据库。它的数据模型并不是原始的数据库表,而是融合了数据库表及表间关系...
- 您还在手工打造增删改查代码么,该神器带你脱离苦海
-
作为Java开发程序,日常开发中,都会使用Spring框架,完成日常的功能开发;在相关业务系统中,难免存在各种增删改查的接口需求开发。通常来说,实现增删改查有如下几个方式:纯手工打造,编写各种Cont...
- Linux基础知识(linux基础知识点及答案)
-
系统目录结构/bin:命令和应用程序。/boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev:dev是Device(设备)的缩写,该目录...
- PL/SQL 杂谈(二)(pl/sql developer使用)
-
承接(一)部分。我们从结构和功能这两个方面展示PL/SQL的关键要素。可以看看PL/SQL的优雅的代码。写出一个好的代码,就和文科生写出一篇优秀的作文一样,那么赏心悦目。1、与SQL的集成PL/S...
- 电商ERP系统哪个好用?(电商erp哪个好一点)
-
电商ERP系统哪个好用?做电商的,谁还没被ERP折腾过?有老板说:“我们早就上了ERP,订单、库存、财务全搞定,系统用得飞起。”也有运营吐槽:“系统是上了,可库存老不准,订单漏单错单天天有,财务对账还...
- 汽车检测线系统实例,看集中控制与PLC分布控制
-
PLC可编程控制器,上个世纪70年代初,为取代早期继电器控制线路,开始采取存储指令方式,完成顺序控制而设计的。开始仅有逻辑运算、计时、计数等简单功能。随着微处理的发展,PLC可编程能力日益提高,已经能...
- 苹果五件套成公司年会奖品主角,几大小技巧教你玩转苹果新品
-
钱江晚报·小时新闻记者张云山随着春节的临近,各家大公司的年会又将陆续上演。上周,各大游戏公司的年会大奖,苹果五件套又成了标配。在上海的游戏公司中,莉莉丝奖品列表拉得相当长,从特等奖到九等奖还包含了特...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)