Redis 管道详解

Redis 管道

关键词:Pipeline

Pipeline 简介

Redis 是一种基于 C/S 模型以及请求/响应协议的 TCP 服务。通常情况下,一个 Redis 命令的请求、响应遵循以下步骤:

  • 客户端向服务端发送一个查询请求,并监听 Socket 返回(通常是以阻塞模式,等待服务端响应)。
  • 服务端处理命令,并将结果返回给客户端。

显然,如果每个 Redis 命令都发起一次请求、响应,会很低效。因此,Redis 客户端提供了一种批量处理技术,即管道技术(Pipeline)。Pipeline 的工作原理就是:将多个 Redis 命令一次性发送给服务端,服务端处理后,统一返回给客户端。由于减少了通信次数,自然提升了处理效率。
在这里插入图片描述

Pipeline 限制

在使用 Redis 管道技术时,要注意一些限制,避免踩坑:

  • Pipeline 不能保证原子性 - Pipeline 只是将客户端发送命令的方式改为批量发送,而服务端在接收到 Pipeline 发来的命令后,将其拆解为一条条命令,然后依然是串行执行。执行过程中,服务端有可能执行其他客户端的命令,所以无法保证原子性。如需保证原子性,可以考虑使用事务或 Lua 脚本。
  • Pipeline 不支持回滚 - Pipeline 没有事务的特性,如果待执行命令的前后存在依赖关系,请勿使用 Pipeline。
  • Pipeline 命令不宜过大 - 使用管道发送命令时,Redis Server 会将部分请求放到缓存队列中(占用内存),执行完毕后一次性发送结果。如果需要发送大量的命令,会占用大量的内存,因此应该按照合理数量分批次的处理。
  • Pipeline 不支持跨 slot 访问 - 由于 Pipeline 不支持跨 slot 访问,因此,在 Redis 集群模式下使用 Pipeline 时要确保访问的 key 都在同一 slot 中。

Pipeline 案例

主流的 Redis 客户端,一般都会支持管道技术。

【示例】Jedis 管道使用示例

public class Demo {

    public static void main(String[] args) {

        String host = "localhost";
        int port = 6379;
        Jedis jedis = new Jedis(host, port);

        String key = "pipeline:test";
        jedis.del(key);

        // -------- 方法1
        method1(jedis, key);

        //-------- 方法2
        method2(jedis, key);
    }

    private static void method2(Jedis jedis, String key) {
        System.out.println("-----方法2-----");
        jedis.del(key);//初始化
        Pipeline pipeline = jedis.pipelined();
        //需要先声明Response
        Response<Long> r1 = pipeline.incr(key);
        System.out.println("Pipeline发送请求");
        Response<Long> r2 = pipeline.incr(key);
        System.out.println("Pipeline发送请求");
        Response<Long> r3 = pipeline.incr(key);
        System.out.println("Pipeline发送请求");
        Response<Long> r4 = pipeline.incr(key);
        System.out.println("Pipeline发送请求");
        Response<Long> r5 = pipeline.incr(key);
        System.out.println("Pipeline发送请求");
        try {
            // 此时还未开始接收响应,所以此操作会出错
            r1.get();
        } catch (Exception e) {
            System.out.println(" <<< Pipeline error:还未开始接收响应  >>> ");
        }
        // 发送请求完成,开始接收响应
        System.out.println("发送请求完成,开始接收响应");
        pipeline.sync();
        System.out.println("Pipeline 接收响应 Response: " + r1.get());
        System.out.println("Pipeline 接收响应 Response: " + r2.get());
        System.out.println("Pipeline 接收响应 Response: " + r3.get());
        System.out.println("Pipeline 接收响应 Response: " + r4.get());
        System.out.println("Pipeline 接收响应 Response: " + r5.get());
        jedis.close();
    }

    private static void method1(Jedis jedis, String key) {
        Pipeline pipeline = jedis.pipelined();
        System.out.println("-----方法1-----");
        for (int i = 0; i < 5; i++) {
            pipeline.incr(key);
            System.out.println("Pipeline 发送请求");
        }
        // 发送请求完成,开始接收响应
        System.out.println("发送请求完成,开始接收响应");
        List<Object> responses = pipeline.syncAndReturnAll();
        if (responses == null || responses.isEmpty()) {
            jedis.close();
            throw new RuntimeException("Pipeline error: 没有接收到响应");
        }
        for (Object resp : responses) {
            System.out.println("Pipeline 接收响应 Response: " + resp.toString());
        }
        System.out.println();
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

3 easy 26. 删除有序数组中的重复项

双指针&#xff1a; //给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 //一致 。然后返回 nums 中唯一元素的个数。 // // 考虑 nums 的唯…

PreMaint CMS系统:数字化驱动起重机远程管理的智能未来

在港口起重机领域&#xff0c;数字化解决方案正成为提高效率、降低停机时间的关键。PreMaint CMS作为起重机核心可视化系统&#xff0c;融合了操作人员、维护团队和管理者的需求&#xff0c;通过智能化的方式&#xff0c;将复杂的数据转化为简洁的信息&#xff0c;实现对起重机…

Node.js中的错误处理和日志记录

在Node.js应用程序中&#xff0c;错误处理和日志记录是非常重要的方面。正确的错误处理和日志记录可以帮助我们更好地跟踪问题、排查 bug&#xff0c;并提供更好的用户体验。在本篇博客中&#xff0c;我将为大家介绍在Node.js中如何进行错误处理和日志记录&#xff0c;以及一些…

BIO实战、NIO编程与直接内存、零拷贝深入辨析

BIO实战、NIO编程与直接内存、零拷贝深入辨析 长连接、短连接 长连接 socket连接后不管是否使用都会保持连接状态多用于操作频繁&#xff0c;点对点的通讯&#xff0c;避免频繁socket创建造成资源浪费&#xff0c;比如TCP 短连接 socket连接后发送完数据后就断开早期的http服…

基于JSP的毕业设计选题系统的设计与实现

基于JSP的毕业设计选题系统的设计与实现 (源代码论文) A. 项目简介 毕业设计选题系统就是能够使学生通过互联网完成毕业设计课题的选定&#xff0c;它采用Web方式&#xff0c;同时适用于局域网和Internet&#xff0c;它要实现审核&#xff0c;权限管理&#xff0c;邮件通知…

Spring6学习技术|IoC|基于注解管理bean

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; IoC注解 首先这是最常用的方法。&#xff08;在学Java基础的时候明明是非常不起眼的知识点啊&#xff01;&#xff01;&#xff01;&#xff09; 从 Java…

二进制部署k8s之网络部分

1 CNI 网络组件 1.1 K8S的三种接口 CRI 容器运行时接口 docker containerd podman cri-o CNI 容器网络接口 flannel calico cilium CSI 容器存储接口 nfs ceph gfs oss s3 minio 1.2 K8S的三种网络 节点网络 nodeIP 物理网卡的IP实现节点间的通信 Pod网络 podIP Pod与Po…

RabbitMQ服务启动失败

报错信息&#xff1a; 在服务中启动RabbitMQ服务显示&#xff1a; RabbitMQ 服务正在启动 . RabbitMQ 服务无法启动。 系统出错。 发生系统错误 1067。 进程意外终止 报错原因&#xff1a; 1.Erlang与RabbitMQ是否匹配 2.Erlang与RabbitMQ安装路径是否存在中文或空格 3.电…

解决谷歌浏览器,每次重启都重置所有设置的问题

一、问题&#xff1a; 修改谷歌浏览器的设置 关闭浏览器再打开设置页面后&#xff0c;会显示&#xff08;部分设置已重置Chrome检测到您的部分设置被其他程序篡改了&#xff0c;因此已将这些设置重置为原始默认设置。了解详情&#xff09; 之前的设置被重置了 二、解决 创建—…

VS2022调试技巧(一)

什么是bug&#xff1f; 在1945年&#xff0c;美国科学家Grace Hopper在进行计算机编程时&#xff0c;发现一只小虫子钻进了一个真空管&#xff0c;导致计算机无法正常工作。她取出虫子后&#xff0c;计算机恢复了正常&#xff0c;由此&#xff0c;她首次将“Bug”这个词用来描…

跳房子 Ⅰ(C语言)

题目来自于博主算法大师的专栏&#xff1a;最新华为OD机试C卷AB卷OJ&#xff08;CJavaJSPy&#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html 题目描述 跳房子&#xff0c;也叫跳飞机&#xff0c;是一种世界性的儿童游戏。 游戏参与者需要分多个回…

Go语言必知必会100问题-06 生产者端接口

生产者端接口 Go语言必知必会100问题-05 接口污染中介绍了程序中使用接口是有价值的。在编码的时候&#xff0c;接口应该放在哪里呢&#xff1f;这是Go开发人员经常有误解的一个问题&#xff0c;本文将深入分析该问题。 在深入探讨问题之前&#xff0c;先对提及的术语做一个定…

2024年老薛主机开工大吉活动:云服务器5折起,续费同价!

2024年老薛主机开工大吉活动开始了&#xff0c;香港/美国云服务器季付7折&#xff0c;半年付6折&#xff0c;年付5折&#xff0c;续费同价&#xff01; 活动地址&#xff1a; 点此直达老薛主机官网 活动详情&#xff1a; 老薛主机2024开年促销活动&#xff0c;香港/美国云服…

全网最全AI绘画工具汇总(二)

一.AI绘画 图像 创造人工智能艺术的方式共有多种方法&#xff0c;包括使用数字模式的程序“基于规则”的图像生成、模拟笔触和其他绘画效果的算法&#xff0c;以及人工智能或深度学习算法等。 最早的重要人工智能艺术系统之一是AARON&#xff0c;由哈罗德科恩于1960年代末开…

Pytorch添加自定义算子之(1)-安装配置Eigen库

一、安装对应的ubuntu环境 推荐使用Docker FROM nvcr.io/nvidia/pytorch:23.01-py3 RUN pip install tensorboardX RUN pip install pyyaml RUN pip install yacs RUN pip install termcolor RUN pip install opencv-python RUN pip install timm0.6.12 WORKDIR /app COPY . …

【LeetCode:2476. 二叉搜索树最近节点查询 + 中序遍历 + 有序表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

vDPA测试环境搭建

要求&#xff1a; 运行 Linux 发行版的计算机。本指南使用 CentOS 9-stream&#xff0c;但对于其他 Linux 发行版&#xff0c;特别是对于 Red Hat Enterprise Linux 7&#xff0c;命令不应有重大变化。 具有 sudo 权限的用户 ~ 主目录中有 25 GB 的可用空间 至少 8GB 内存 …

蓝桥杯-扫雷

代码解答及思路: #include <iostream> using namespace std; int main() { int n,m; int a[100][100] {0},b[100][100];//记住要开数组确数 &#xff0c;这样外围就会有边 &#xff0c;不能直接设置值&#xff0c;要记住&#xff01;&#xff01;&#xff01;&#…

FairyGUI × Cocos Creator 3.x 场景切换

前言 前文提要&#xff1a; FariyGUI Cocos Creator 入门 FairyGUI Cocos Creator 3.x 使用方式 个人demo&#xff1a;https://gitcode.net/qq_36286039/fgui_cocos_demo_dust 个人demo可能会更新其他代码&#xff0c;还请读者阅读本文内容&#xff0c;自行理解并实现。 官…

模版(初级)

一.泛型编程 当我们要写一个交换函数时&#xff0c;面对不同的类型&#xff0c;我们可能就需要向如下这么写&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; }void Swap(double& left, double& right) {double tem…