Redis原理篇(三)通信协议

news2024/11/14 15:00:11

一、RESP协议

1、定义

Redis是一个cs架构的软件,通信一般分两步:

  1. 客户端client向服务端server发送一条命令
  2. 服务端解析并执行命令,返回响应结果给客户端

因此客户端发送命令的格式、服务端响应结果的格式必须有一个规范,这个规范就是通信协议。

而在Redis采用RESP协议:

  • Redis1.2版本引入RESP协议
  • Redis2.0版本中成为与edis服务通信的标准,称为RESP2
  • Redis6.0版本中,从RESP2升级到RESP3,增加了更多数据类型并且支持6.0新特性–客户端缓存

2、数据类型

RESP中,通过首字节的字符来区分不同数据类型,常用的有5种:

数据类型说明示例
单行字符串首字节是‘+’,后面跟单行字符串,以CRLF(\r\n)结尾返回OK: “+OK \r\n”
错误(Errors)首字节是‘-’,同上,以CRLF(\r\n)结尾“-Errors message \r\n”
数值首字节是‘:’,后面跟上数字格式的字符串,以CRLF(\r\n)结尾“:10 \r\n”
多行字符串首字节是‘$’,表示二进制安全的字符串,最大支持512MB“$5\r\nhello\r\n”
数组首字节是‘*’,后面跟上数组元素个数,再跟上元素,元素数据类型不限见下图

在这里插入图片描述

二、模拟Redis客户端

public class Main {

    static Socket socket;
    static PrintWriter writer;
    static BufferedReader reader;

    public static void main(String[] args) {
        try {
            //1.建立连接
            String host = "127.0.0.1";
            int port = 6379;
            socket = new Socket(host, port);
            //2.获取流
            writer = new PrintWriter(socket.getOutputStream());
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
            //3、发送请求
            sendRequest("set", "name", "xiaohong");
            //4、解析响应
            Object obj = handleRepose();
            System.out.println(obj);
            //5、发送请求
            sendRequest("get", "name");
            //6、解析响应
            Object obj2 = handleRepose();
            System.out.println(obj2);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
                if (writer != null) {
                    writer.close();
                }
                if (socket != null) {
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // set name allen
    private static void sendRequest(String ...args) {
        writer.println("*" + args.length);
        for (String str: args) {
            writer.println("$" + str.getBytes(StandardCharsets.UTF_8).length);
            writer.println(str);
        }
        writer.flush();
    }

    private static Object handleRepose() {
        try {
            int prefix = reader.read();
            if (prefix == '+') {
                return reader.readLine();
            } else if (prefix == '-') {
                throw new RuntimeException(reader.readLine());
            } else if (prefix == ':') {
                return Long.valueOf(reader.readLine());
            } else if (prefix == '$') {
                int len = Integer.parseInt(reader.readLine());
                if (len == -1) {
                    return null;
                }
                if (len == 0) {
                    return "";
                }
                return reader.readLine();
            } else if (prefix == '*') {
                return readBulkString();
            } else {
                throw new RuntimeException("错误格式");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static Object readBulkString() throws IOException {
        int len = Integer.parseInt(reader.readLine());
        if (len <= 0) {
            return null;
        }
        // 定义集合,接收多个元素
        List<Object> list = new ArrayList<>(len);
        // 遍历,依次读取每个元素
        for (int i = 0; i < len; i++) {
            list.add(handleRepose());
        }
        return list;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HashMap源码学习:JDK1.8版本源码解析

文章导航 HashMap源码学习&#xff1a;红黑树原理详解 HashMap源码学习&#xff1a;JDK1.8版本源码解析 目录文章导航前言正文HashMap重要属性HashMap构造方法HashMap扩容方法HashMap链表迁移HashMap红黑树迁移HashMap链表转红黑树HashMap红黑树转链表HashMap添加数据HashMap移…

让你彻底明白Java SPI与SpringBoot自动配置,内附实例代码演示

一、Java SPI的概念和术语 SPI&#xff1a;全称是Service Provider Interface&#xff1a;是一种基于ClassLoader来发现并加载服务的机制 SPI由三个组件构成&#xff1a;Service、Service Provider、ServiceLoader Service&#xff1a;是一个公开的接口或抽象类&#xff0c;定…

数说菊风2022

春风传捷报&#xff0c; 梅韵贺新年&#xff01; 2022&#xff0c;已悄然划过&#xff0c; 就让我们用数字说话&#xff0c; 述说这年的精彩&#xff01; 树十大标杆案例 国际运营商战略合作——Telkomsel 携手印尼运营商Telkomsel在RCS融合通信和RTC实时音视频领域形成合…

golang入门笔记——kitex

WSL的安装 由于Kitex并不支持Linux&#xff0c;所以需要首先安装WSL2 WSL一句话来说就是微软出的一个虚拟机工具 Win11下安装WSL2的步骤为&#xff1a; 1.“开始菜单”搜索功能&#xff0c;打开“启动或关闭Window功能” 2.勾选以下功能 1.适用于Linux的Window子系统 2.虚…

qsort函数

目录1.什么是qsort函数2.实现一个qsort函数3.用qsort函数排序一个结构体4.模仿qsort的功能实现一个通用的冒泡排序1.什么是qsort函数 我们以前学习过的一些排序算法&#xff0c;如冒泡、希尔、快排等等&#xff0c;它们速度有快有满&#xff0c;但是这些排序都只能排序一种类型…

iOS 内存泄漏检测 Instruments Leaks

Xcode 中 按住 command I 或者菜单栏 Product – Profile 2. 双击 Leaks 或者按 choose&#xff0c;打开 Leaks 面板 3. 在显示的 Leaks 面板中&#xff0c;点击左上角红色点&#xff0c;即可运行内存检测。 4. 在运行过程中如果发现Leak Checks&#xff08;如图&#xff09;…

【C进阶】C进阶练习编程题

⭐博客主页&#xff1a;️CS semi主页 ⭐欢迎关注&#xff1a;点赞收藏留言 ⭐系列专栏&#xff1a;C语言进阶 ⭐代码仓库&#xff1a;C Advanced 家人们更新不易&#xff0c;你们的点赞和关注对我而言十分重要&#xff0c;友友们麻烦多多点赞&#xff0b;关注&#xff0c;你们…

关闭“此版本的Windows不再支持Microsoft Edge”提示

在Win7中&#xff0c;安装Microsoft Edge&#xff0c;升级到“109.0.1518.55 (正式版本)”后&#xff0c;打开Edge会弹出提示&#xff1a; 此版本的 Windows 不再支持 Microsoft Edge。升级到 Windows 10 或更高版本&#xff0c;以从 Microsoft Edge 获取常规功能和安全更新。 …

ESPNet: 自动驾驶领域轻量级分割模型

论文标题&#xff1a;ESPNet: Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation 论文地址&#xff1a;https://arxiv.org/pdf/1803.06815v2.pdf 开源地址&#xff1a; https://github.com/sacmehta/ESPNet 论文思想 ESPNet是用于语义分割的轻量…

一文弄懂Linux虚拟机网络配置

文章目录计算机网路基础网络连接模式Bridged&#xff08;桥接模式&#xff09;NAT&#xff08;地址转换模式&#xff09;Host-Only&#xff08;仅主机模式&#xff09;Linux常用网络相关命令ifconfig&#xff1a;配置网络接口ping&#xff1a;测试主机之间网络连通性修改ip地址…

Threejs 导入动态模型 - 兔子岛

Threejs 动画模型GLTF加载器&#xff08;GLTFLoader&#xff09; glTF&#xff08;gl传输格式&#xff09;是一种开放格式的规范 &#xff08;open format specification&#xff09;&#xff0c; 用于更高效地传输、加载3D内容。该类文件以JSON&#xff08;.gltf&#xff09;…

产品心理学:福格行为模型详解与应用

​Fogg说人的行为由动机&#xff0c;能力和触发条件这三要素组成&#xff0c;这三个同时都满足时行为才会发生。用一个等式来简化就是&#xff1a; BMAT 其中B是Behavior行为&#xff0c;M是Motivation 动机&#xff0c;A是Ability能力&#xff0c;T是Triggers触发。 行为的发…

“华为杯”研究生数学建模竞赛2004年-【华为杯】B题:实用下料的数学模型(附优秀论文)

赛题描述 “下料问题(cutting stock problem)”是把相同形状的一些原材料分割加工成若干个不同规格大小的零件的问题,此类问题在工程技术和工业生产中有着重要和广泛的应用. 这里的“实用下料问题”则是在某企业的实际条件限制下的单一材料的下料问题。 一个好的下料方案首先…

JavaEE4-Spring使用

目录 1.存储Bean对象到Spring容器中 1.1.创建Bean 1.2.将Bean注册到Spring容器中 1.2.1.第一次存储Bean&#xff08;可选&#xff0c;如果是第二次及以后&#xff0c;此步骤忽略&#xff09; 1.2.2.添加Bean标签 2.从Spring容器中获取并使用Bean对象 2.1.创建Spring上下…

ADC架构_Flash

ADC架构_Flash 比较器做1位ADC Vin > Vref Vout High&#xff08;1&#xff09; Vin < Vref Vout Low&#xff08;0&#xff09; 比较器是组建集成ADC的内部基本而又关键的模块&#xff1b;在比较器应用在ADC中一般要求很高的分辨率&#xff0c;也就是很小的差分输…

Spring Security 认证研究

2 Spring Security 认证研究 2.1 Spring Security介绍 认证功能几乎是每个项目都要具备的功能&#xff0c;并且它与业务无关&#xff0c;市面上有很多认证框架&#xff0c;如&#xff1a;Apache Shiro、CAS、Spring Security等。由于本项目基于Spring Cloud技术构建&#xff…

java数组2023014

数组&#xff1a;首先数组也是一种类型 Java的数组要求所有的数组元素具有相同的数据类型。因此&#xff0c;在 一个数组中&#xff0c;数组元素的类型是唯一的&#xff0c;即一个数组里只能存储一种数据类型的数据&#xff0c;不能存储多种数据类型的数据。 注意&#xff1a; …

MySQL数据库约束(主键约束,外键约束详解)

关系型数据库的一个重要功能:需要保证数据的"完整性",可以通过人工的方式来观察确认数据的正确性,这种方式是可行的,但是不合适,因为人为控制的方式势必会存在疏忽,导致一些错误没有被检查出来,所以MySQL数据库定义了一些约束来帮助程序员更好的检查数据的正确系!一,…

git cherry-pick 教程

对于多分支的代码库&#xff0c;将代码从一个分支转移到另一个分支是常见需求。 这时分两种情况。一种情况是&#xff0c;你需要另一个分支的所有代码变动&#xff0c;那么就采用合并&#xff08;git merge&#xff09;。另一种情况是&#xff0c;你只需要部分代码变动&#x…

目标检测-yolov1的详细理解(代码和原理)

目标检测算法&#xff0c;主要分为两类&#xff1a; 一类是以R-CNN为代表的两阶段检测算法&#xff0c;将目标检测任务分为边界框回归和物体分类两个模块二是yolo系列算法&#xff0c;是将目标检测任务看作是回归任务。 原理 yolov1将图像划分为S*S的网格&#xff0c;如果检测…