redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线
文章目录
- 【README】
- 【1】redis流水线Pipeline
- 【1.1】redis流水线概念
- 【1.2】redis流水线性能测试
- 【1.2.1】使用流水线与未使用流水线的性能对比
- 【1.2.2】使用流水线与redis原生批量命令的性能对比
- 【1.2.3】流水线缺点
- 【1.3】Jedis客户端执行流水线
- 【1.3.1】Jedis客户端执行流水线实现批量删除代码实践
- 【1.3.2】Jedis客户端执行流水线并获取执行结果代码实践
【README】
本文总结自《redis开发与运维》,作者付磊,张益军,墙裂推荐;
- 本文使用的redis版本是 7.0.15 ;
- 本文主要介绍redis流水线概念及jedis操作流水线代码实践;
- 代码参见: https://github.com/TomJourney/redisDiscover/tree/master
【1】redis流水线Pipeline
1)redis客户端执行一条命令分为4个步骤:
- 发送命令;
- 命令排队;
- 命令执行;
- 返回结果;
2)RTT往返时间:发送命令与返回结果的执行耗时(RTT-Round Trip Time) ;
3)问题与解决方法:
-
问题:redis的批量操作命令能够有效节约RTT,如mget,mset。但问题是大部分命令不支持批量操作,如hgetall,即批量业务场景只能执行单条命令,网络IO高,导致RTT高。
- 【例】: redis客户端在北京,服务器在上海,两地直线距离为1300公里,1次RTT时间=1300*2/(300000 * 2/3) = 13ms(光在真空中的速度为每秒30w公里,假设光纤传播速度为光速的2/3,即每秒20w公里)
- 若批量业务场景需要执行10次hgetall,则需要130ms,单单操作redis的网络io就有130ms,还不算正常的业务逻辑耗时,显然操作redis的耗时是不合理的(补充: 一般一次请求响应的网络耗时不超过200ms );
-
解决方法:使用redis流水线技术;
4)其他补充: redis命令真正执行的耗时是微秒级别(1s=1000000 microsecond);所以才会有redis性能瓶颈在网络开销的说法 ;
【1.1】redis流水线概念
1)redis流水线:能够将一组redis命令进行组装, 通过一次RTT传输给redis,再将这组执行结果一次性返回给客户端;即使用pipeline执行n次命令,耗时1个RTT;

【1.2】redis流水线性能测试
【1.2.1】使用流水线与未使用流水线的性能对比
1)在不同网络环境下, 10000条set未使用流水线命令 与 使用流水线命令执行耗时如下。

2)redis流水线性能对比结论:
- 流水线执行速度一般比逐条执行要快;
- 客户端与服务器的网络延时越大,,则流水线的效果越明显;
【1.2.2】使用流水线与redis原生批量命令的性能对比
1)流水线与原生批量命令区别:
- 流水线执行命令不是原子的,而原生批量命令是原子的;
- 流水线支持多个命令,而原生批量命令是一个命令操作多个key,如mset;
- 流水线需要客户端与服务器同时提供支持,而原生批量命令是redis服务器提供支持;
【1.2.3】流水线缺点
1)每次流水线封装的命令不能太多,流水线组装的命令过多可能导致阻塞;
- 一方面:一次流水线可能增加客户端的等待时间;
- 另一方面:造成一定的网络阻塞;
2)解决方法: 可以将包含大量命令的流水线拆分为多个小流水线;
【1.3】Jedis客户端执行流水线
【1.3.1】Jedis客户端执行流水线实现批量删除代码实践
【PooledJedisBatchDelViaPipeline】池化jedis操作流水线
public class PooledJedisBatchDelViaPipeline {public static void main(String[] args) {BusiJedisFactoryUsingPool busiJedisFactoryUsingPool = BusiJedisFactoryUsingPool.build();// 从jedis连接池获取jedis对象Jedis jedis = busiJedisFactoryUsingPool.getJedis();try {System.out.println(jedis.get("user01"));System.out.println(jedis.get("user02"));batchDelete(jedis, Arrays.asList("user01", "user02"));} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);} finally {if (Objects.nonNull(jedis)) {jedis.close();}}// 删除键之后获取键// 从jedis连接池获取jedis对象System.out.println("========== 删除键之后获取键 ========== ");jedis = busiJedisFactoryUsingPool.getJedis();try {System.out.println(jedis.get("user01"));System.out.println(jedis.get("user02"));} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);} finally {if (Objects.nonNull(jedis)) {jedis.close();}}}private static void batchDelete(Jedis jedis, List<String> keys) {// 生成pipeline对象Pipeline pipeline = jedis.pipelined();for (String key : keys) {pipeline.del(key);}// 提交命令到redispipeline.sync();}
}
【日志】
zhagnsan01
zhagnsan02
========== 删除键之后获取键 ==========
null
null
【代码解说】
- jedis.pipelined() :创建流水线对象;
- pipeline.del(String key) 与 jedis.del(String key) 的写法是一致的,只不过pipeline.del(String key) 不会立即执行命令;
- pipeline.sync() 执行流水线组装的多个命令(发送组装多个命令的流水线到redis服务器)
【1.3.2】Jedis客户端执行流水线并获取执行结果代码实践
1)syncAndReturnAll(): 执行流水线命令并获取执行结果
【PooledJedisSetAndGetResultViaPipeline】
public class PooledJedisSetAndGetResultViaPipeline {public static void main(String[] args) {BusiJedisFactoryUsingPool busiJedisFactoryUsingPool = BusiJedisFactoryUsingPool.build();// 从jedis连接池获取jedis对象Jedis jedis = busiJedisFactoryUsingPool.getJedis();try {setAndGetReulst(jedis);} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);} finally {if (Objects.nonNull(jedis)) {jedis.close();}}}private static void setAndGetReulst(Jedis jedis) {// 生成pipeline对象Pipeline pipeline = jedis.pipelined();pipeline.set("user03", "zhangsan03");pipeline.incr("age");// syncAndReturnAll 执行流水线命令并返回结果List<Object> resultList = pipeline.syncAndReturnAll();for (Object result : resultList) {System.out.println(result);}}
}
【日志】
OK
2
相关文章:
redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线
文章目录 【README】【1】redis流水线Pipeline【1.1】redis流水线概念【1.2】redis流水线性能测试【1.2.1】使用流水线与未使用流水线的性能对比【1.2.2】使用流水线与redis原生批量命令的性能对比【1.2.3】流水线缺点 【1.3】Jedis客户端执行流水线【1.3.1】Jedis客户端执行流…...
OPPO Java面试题及参考答案
Java 语言的特点 Java 是一种面向对象的编程语言,它具有以下显著特点。 首先是简单性。Java 的语法相对简单,它摒弃了 C 和 C++ 语言中一些复杂的特性,比如指针操作。这使得程序员能够更专注于业务逻辑的实现,而不是陷入复杂的语法细节中。例如,Java 的内存管理是自动进行…...
Ubuntu 22.04 升级 24.04 问题记录
一台闲置笔记本使用的 ubuntu 还是 18.04,最近重新使用,发现版本过低,决定升级,于是完成了 18.04 -> 20.04 -> 22. 04 -> 24.04 的三连跳。 一、升级过程中黑屏 主要问题是在 22.04 升级到 24.04 过程中出现了黑屏仅剩…...
Java重要面试名词整理(五):Redis
文章目录 Redis高级命令Redis持久化RDB快照(snapshot)**AOF(append-only file)****Redis 4.0 混合持久化** 管道(Pipeline)**StringRedisTemplate与RedisTemplate详解**Redis集群方案gossip脑裂 Redis LuaR…...
单元测试中创建多个线程测试 ThreadLocal
单元测试中创建多个线程测试 ThreadLocal 在单元测试中,可以通过以下方式创建多个线程来测试 ThreadLocal 的行为。 目标 验证 ThreadLocal 在多线程环境下是否能正确隔离每个线程的数据。 实现步骤 定义需要测试的类 包含 ThreadLocal 对象的类,提供…...
iDP3复现代码数据预处理全流程(二)——vis_dataset.py
vis_dataset.py 主要作用在于点云数据的可视化,并可以做一些简单的预处理 关键参数基本都在 vis_dataset.sh 中定义了,需要改动的仅以下两点: 1. 点云图像保存位置,因为 dataset_path 被设置为了绝对路径,因此需要相…...
容器化部署服务全流程
系列文章目录 文章目录 系列文章目录前言一、什么是容器?二、如何安装docker三、如何写dockerfile四、如何启动服务五、常见命令总结总结 前言 这篇文章,主要目的是通过容器化技术简化应用程序的部署、运行和管理,提高开发、测试和生产环境…...
Flutter DragTarget拖拽控件详解
文章目录 1. DragTarget 控件的构造函数主要参数: 2. DragTarget 的工作原理3. 常见用法示例 1:实现一个简单的拖拽目标解释:示例 2:与 Draggable 结合使用解释: 4. DragTarget 的回调详解5. 总结 DragTarget 是 Flutt…...
操作系统动态分区分配算法-首次适应算法c语言实现
目录 一、算法原理 二、算法特点 1.优先利用低址空闲分区: 2.查找开销: 3.内存碎片: 三、内存回收四种情况 1.回收区上面(或后面)的分区是空闲分区: 2.回收区下面(或前面)的…...
mybatis-plus自动填充时间的配置类实现
mybatis-plus自动填充时间的配置类实现 在实际操作过程中,我们并不希望创建时间、修改时间这些来手动进行,而是希望通过自动化来完成,而mybatis-plus则也提供了自动填充功能来实现这一操作,接下来,就来了解一下mybatis…...
Vite内网ip访问,两种配置方式和修改端口号教程
目录 问题 两种解决方式 结果 总结 preview.host preview.port 问题 使用vite运行项目的时候,控制台会只出现127.0.0.1(localhost)本地地址访问项目。不可以通过公司内网ip访问,其他团队成员无法访问,这是因为没…...
【星海随笔】删除ceph
cephadm shell ceph osd set noout ceph osd set norecover ceph osd set norebalance ceph osd set nobackfill ceph osd set nodown ceph osd set pause参考文献: https://blog.csdn.net/lyf0327/article/details/90294011 systemctl stop ceph-osd.targetyum re…...
HarmonyOS NEXT实战:自定义封装多种样式导航栏组件
涉及知识点和装饰器 ComponentV2,Local, Builder,BuilderParam,Extend, Require ,Param,Event等第三方库:ZRouter ,如项目中本来就用了ZRouter路由库,案例中…...
大数据面试笔试宝典之Flink面试
1.Flink 是如何支持批流一体的? F link 通过一个底层引擎同时支持流处理和批处理. 在流处理引擎之上,F link 有以下机制: 1)检查点机制和状态机制:用于实现容错、有状态的处理; 2)水印机制:用于实现事件时钟; 3)窗口和触发器:用于限制计算范围,并定义呈现结果的…...
pytorch整体环境打包安装到另一台电脑上
步骤一:安装conda-pack 首先利用 pip list 指令检查conda环境安装在哪里,在系统环境(base)下,于是我是使用的conda指令完成的。 # 使用Conda安装(如果已安装conda) conda install conda-pack …...
PostgreSQL 数据库连接
title: PostgreSQL 数据库连接 date: 2024/12/29 updated: 2024/12/29 author: cmdragon excerpt: PostgreSQL是一款功能强大的开源关系数据库管理系统,在现代应用中广泛应用于数据存储和管理。连接到数据库是与PostgreSQL进行交互的第一步,这一过程涉及到多个方面,包括连…...
【算法】复杂性理论初步
六、算法复杂性初步 重要的复杂性类 P P P 的定义 多项式时间内可解的问题 若 L ∈ P L∈P L∈P,则存在确定性多项式时间的图灵机 M M M,使得 M ( x ) 1 ⟺ x ∈ L M(x)1⟺x∈L M(x)1⟺x∈L N P NP NP 的定义 多项式时间内可验证验证解的正确性 &…...
HarmonyOS NEXT应用开发实战:免费练手的网络API接口分享
学习一项技能,最好也最快的办法就是直接动手实战。在实战中不断的总结经验和收获成就感。这里分享些好用且免费的网络API练手接口,这对于想要提升自己网络开发能力的开发者来说,无疑是极大的福音。今天,我将详细介绍一个API接口集…...
C++的第一个程序
前言 在学习c之前,你一定还记得c语言的第一个程序 当时刚刚开始进行语言学习 因此告诉到,仅仅需要记住就可以 #include <stdio.h>int main(){printf("Hello World");return 0; }而对于c中的第一个程序,似乎有所变化 C的…...
Java 中 Stream 流的使用详解
Java 中 Stream 流的使用详解 什么是 Stream? Stream 是 Java 8 引入的一种全新的操作集合的方式。它支持通过声明性方式对集合进行复杂的数据操作(如过滤、排序、聚合等),避免使用大量的 for 循环,提高代码的可读性…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
