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个步骤:

  1. 发送命令;
  2. 命令排队;
  3. 命令执行;
  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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497868.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KOI技术-事件驱动编程(Sping后端)

1 “你日渐平庸&#xff0c;甘于平庸&#xff0c;将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的&#xff0c;那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人&#xff0c;和他们斗了那么久&#xff0c;最终却要变得和他们一样&#xff0c;…

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段&#xff1a;定义小程序顶部、底部 tab 栏&#xff0c;用以实现页面之间的快速切换&#xff1b;可以通过 tabBar 配置项指定 tab 栏的表现&#xff0c;以及 tab 切换时显示的对应页面&#xff1b; 在上面图中&#xff0c;标注了一些 tabBar …

小程序基础 —— 08 文件和目录结构

文件和目录结构 一个完整的小程序项目由两部分组成&#xff1a;主体文件、页面文件&#xff1a; 主体文件&#xff1a;全局文件&#xff0c;能够作用于整个小程序&#xff0c;影响小程序的每个页面&#xff0c;主体文件必须放到项目的根目录下&#xff1b; 主体文件由三部分组…

使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图

在做一些尺度分析时&#xff0c;经常会涉及到对研究区构建不同尺度的渔网进行分析&#xff0c;渔网的形状通常为规则四边形。构建渔网的方法也很简单&#xff0c;使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…

【K8S问题系列 | 21 】K8S中如果PV处于Bound状态,如何删除?【已解决】

在Kubernetes&#xff08;K8S&#xff09;的存储管理体系中&#xff0c;持久卷&#xff08;PersistentVolume&#xff0c;PV&#xff09;是一种重要的资源&#xff0c;它为Pod提供了持久化存储能力。当PV处于Bound状态时&#xff0c;意味着它已经与某个持久卷声明&#xff08;P…

旅游管理系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

Qt5 中 QGroupBox 标题下沉问题解决

我们设置了QGroupBox 样式之后,发现标题下沉了,那么如何解决呢? QGroupBox {font: 12pt "微软雅黑";color:white;border:1px solid white;border-radius:6px; } 解决后的效果 下面是解决方法: QGroupBox {font: 12pt "微软雅黑";color:white;bo…

六大基础深度神经网络之CNN

左侧是传统卷积网络输入的是一列像素点&#xff0c;右侧是卷积神经网络&#xff0c;输入的是具有长宽通道数的原始图像 下图为整体架构。卷积层可以认为提取特征&#xff0c;池化层是压缩特征。全连接层是把图像展平然后计算10个类别的概率值 给出一张图像不同区域的特征不同&a…

抽象工厂设计模式的理解和实践

在软件开发中&#xff0c;设计模式是前人通过大量实践总结出的、可复用的、解决特定问题的设计方案。它们为我们提供了一种标准化的解决方案&#xff0c;使得代码更加简洁、灵活和易于维护。在众多设计模式中&#xff0c;抽象工厂模式&#xff08;Abstract Factory Pattern&…

从入门到精通:Vim 高效文本编辑全面指南

文章目录 前言&#x1f9ec;一、Vim 的编辑哲学&#xff1a;模式分离与高效键盘操作&#x1f9ec;二、基础命令与快捷键&#xff1a;从简单到熟悉&#x1f9ec;三、进阶功能&#xff1a;多文件、分屏与可视化模式&#x1f9ec;四、自定义配置与 .vimrc&#xff1a;打造你的专属…

大模型-ChatGLM2-6B模型部署与微调记录

大模型-ChatGLM2-6B模型部署与微调记录 模型权重下载&#xff1a; 登录魔塔社区&#xff1a;https://modelscope.cn/models/ZhipuAI/chatglm2-6b 拷贝以下代码执行后&#xff0c;便可快速权重下载到本地 # 备注&#xff1a;最新模型版本要求modelscope > 1.9.0 # pip insta…

连锁餐饮行业数据可视化分析方案

引言 随着连锁餐饮行业的迅速发展&#xff0c;市场竞争日益激烈。企业需要更加精准地把握运营状况、消费者需求和市场趋势&#xff0c;以制定科学合理的决策&#xff0c;提升竞争力和盈利能力。可视化数据分析可以帮助连锁餐饮企业整合多源数据&#xff0c;通过直观、动态的可…

NiChart 多模态神经影像(structural MRI,functional MRI,and diffusion MRI)处理和分析工具包安装

NiChart多模态神经影像部署 NiChart 本地安装Git clone 问题personal access token PAT 问题 NiChart 云端注册AWS验证问题 NiChart 是UPenn大学&#xff0c;Christos Davatzikos教授开发的一个多模态MRI影像&#xff0c;structural (sMRI), diffusion (dMRI)&#xff0c; and …

人工智能与云计算的结合:如何释放数据的无限潜力?

引言&#xff1a;数据时代的契机 在当今数字化社会&#xff0c;数据已成为推动经济与技术发展的核心资源&#xff0c;被誉为“21世纪的石油”。从个人消费行为到企业运营决策&#xff0c;再到城市管理与国家治理&#xff0c;每个环节都在生成和积累海量数据。然而&#xff0c;数…

【代码分析】Unet-Pytorch

1&#xff1a;unet_parts.py 主要包含&#xff1a; 【1】double conv&#xff0c;双层卷积 【2】down&#xff0c;下采样 【3】up&#xff0c;上采样 【4】out conv&#xff0c;输出卷积 """ Parts of the U-Net model """import torch im…

构建全志 T113 Tina SDK

1、环境配置&#xff1a; 准备一个 Ubuntu 系统&#xff0c;可以是 WSL&#xff0c;虚拟机等&#xff0c;建议版本是 20.04。 1.1、安装必要的软件 进入系统后&#xff0c;输入下方命令安装需要的工具 &#xff1a; sudo apt update -y sudo apt full-upgrade -y sudo apt i…

深度学习:基于MindSpore NLP的数据并行训练

什么是数据并行&#xff1f; 数据并行&#xff08;Data Parallelism, DP&#xff09;的核心思想是将大规模的数据集分割成若干个较小的数据子集&#xff0c;并将这些子集分配到不同的 NPU 计算节点上&#xff0c;每个节点运行相同的模型副本&#xff0c;但处理不同的数据子集。…

python爬虫爬抖音小店商品数据+数据可视化

爬虫代码 爬虫代码是我调用的数据接口&#xff0c;可能会过一段时间用不了&#xff0c;欢迎大家留言评论&#xff0c;我会不定时更新 import requests import time cookies {token: 5549EB98B15E411DA0BD05935C0F225F,tfstk: g1vopsc0sQ5SwD8TyEWSTmONZ3cA2u6CReedJ9QEgZ7byz…

【基于rust-wasm的前端页面转pdf组件和示例】

基于rust-wasm前端页面转pdf组件和示例 朔源多余的废话花哨的吹牛那点东西要不要拿来试试事到如今 做个美梦 我觉得本文的意义在于,wasm扩展了浏览器的边界,但是又担心如同java的web applet水土不服. 如同我至今看不出塞班和iOS的不同下载地址&#xff1a;在github的备份 朔源…

Python的简单爬虫框架

爬虫为网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、…