Redis原理篇(三)通信协议

news/2023/5/28 8:12:16

一、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 allenprivate 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.exyb.cn/news/show-4577323.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

如何用电脑连接小爱同学蓝牙音箱

很多朋友问我电脑连接小爱同学后&#xff0c;发现小爱同学没有声&#xff0c;但是蓝牙显示正常连接&#xff0c;今天我为大家出一个详细的教学。 进入小爱同学的蓝牙设置&#xff0c;将蓝牙可被发现打开&#xff1b;然后打开电脑蓝牙&#xff0c;进行小爱同学蓝牙配对&#xf…

ESP8266 WIFI+舵机+小爱同学+blinker___宿舍关灯神器

现象结果&#xff1a; 小爱同学宿舍开关灯材料清单&#xff1a; ESP8266 WIAF模块一个&#xff1b; G90舵机一个&#xff1b; 杜邦线若干&#xff1b; USB数据线一条&#xff1b; 电源&#xff08;这里我用的是充电宝&#xff09;&#xff1b; 应用软件方面需要用到如下的…

编程应该纳入中小学吗?

原创文章&#xff0c;欢迎转载。转载请注明&#xff1a;转载自IT人故事会&#xff0c;谢谢&#xff01; 原文链接地址&#xff1a;编程应该纳入中小学吗&#xff1f; 实施全民智能教育项目,在中小学阶段设置人工智能相关课程,逐步推广编程教育,鼓励社会力量参与寓教于乐的编程教…

(含代码)ESP8266+舵机 制作wifi灯控开关(arduino,点灯科技,小爱同学/天猫精灵实现)

目录 项目涉及的主代码 前言 一、环境搭建 二、开发步骤 1.注册点灯科技平台 2.在点灯科技平台注册设备&#xff0c;获取Secret Key 3.在Arduino IDE中编写代码&#xff0c;写入ESP8266 4.编译固件&#xff0c;烧入到ESP8266中 5.将舵机连接至ESP8266 6.绑定小爱同学/…

C# 网络编程之最简单浏览器实现

最近学习C#网络编程的HTTP协议编程&#xff0c;HTTP即Hypertext Transfer Protocol的缩写&#xff0c;意为&#xff1a;超文本传输协议。其中与HTTP相关的知识主要有六个类的知识&#xff0c;分别是 (1).HttpWebRequest类&#xff1a;用于获取和操作HTTP请求&#xff1b;…

Windows编程—获取Chrome浏览器的安装目录

文章目录前言方式一说明代码方式二说明代码前言 在Windows平台开发时&#xff0c;有时候需要唤起Chrome浏览器访问指定url&#xff0c; 这时就需要知道Chrome浏览器的安装路径了。笔者这里总结了2种方式&#xff0c;建议使用方式二。 方式一 说明 方式一&#xff0c;我们可…

esp8266接入米家、小爱同学,附开源app控制

超简单&#xff0c;两步完事第一步 下载程序到esp8266第二步 绑定到米家第三步 &#xff08;附&#xff09;开源app控制第一步 下载程序到esp8266 下载地址: 点击下载 本demo 是利用arduino IDE开发&#xff0c;关于arduino IDE 的ESP8266环境配置可参考&#xff1a;环境配置…

小爱同学调用系统接口,语音下发任务

需求很简单,就是语音对话小爱,调用系统接口,达到下发任务的目的 1.立即开发 2.开始创建技能 3.点击自定义技能 4.技能名称随便定义,面向设备,这边的需求是小爱音响 5.设置调用名称,上传图标,必填项都填满就行了 6.添加意图,3个系统意图一定要添加,不然莫名其妙的错误,添加一个…

Eclipse 启动Tomcat报错 Removing obsolete files from server

解决办法&#xff1a;复制Eclipse中servers下的server.xml文件到tomcat中&#xff0c;重启Eclipse

配置yum源(removing mirrorlist with no valid mirrors Cannot find a valid baseurl for repo)

问题&#xff1a;removing mirrorlist with no valid mirrors Cannot find a valid baseurl for repo 我的是centos6.9的i386版本&#xff0c;今天刚用虚拟机装了centos&#xff0c;想下载一点东西出现下面的错误&#xff1a; 花了好大劲才弄好。原因是版本太老旧了&#xff0…

android Removing unused resources requires unused code shrinking to be turned on

这个问题截图 android Removing unused resources requires unused code shrinking to be turned on. 意思是 “删除未使用的资源需要打开未使用的代码缩减。” 原因&#xff1a;就是下图导致的 如果 要 使用 删除无用资源shrinkResources true&#xff0c; 必须要 打开…

Synaplify综合Removing

记录一下用Synaplify综合出现的Removing警告问题&#xff0c;在用Synaplify综合的时候&#xff0c;你可能综合完之后发现有的port不见了&#xff0c;或者instance不见了&#xff0c;这都是很常见的问题&#xff0c;这个时候你只要去搜索log关键词Removing&#xff0c;再和你要找…

tar: Removing leading '/' from member names

RT tar: Removing leading / from member names 去除文件名中前导的根目录“/”&#xff0c;tar 命令在压缩文件时&#xff0c;默认会取相对路径&#xff0c;不会取从根路径下来的绝对路径&#xff0c;所以&#xff0c;如果待压缩的源路径是绝对路径&#xff0c;便会报该错误…

[CVPR2018]PairedCycleGAN: Asymmetric Style Transfer for Applying and Removing Makeup

标题&#xff1a;PairedCycleGAN: Asymmetric Style Transfer for Applying and Removing Makeup 链接&#xff1a;https://openaccess.thecvf.com/content_cvpr_2018/papers/Chang_PairedCycleGAN_Asymmetric_Style_CVPR_2018_paper.pdf 本文主要的思路就是将cycleGAN用于妆…

windows server 2019卸载Docker Desktop卡Removing VM and images解决

一&#xff0c;安装Docker Desktop 4.6.0 无法正常启动&#xff0c;退版本&#xff0c;下载4.4.4版本&#xff0c;历史版本地址&#xff1a;Docker for Windows release notes | Docker Documentation 二&#xff0c;Docker Desktop4.4.4也无法使用&#xff0c;卸载该版本时&am…

Sea-thru: A Method For Removing Water From Underwater Images论文研读

Sea-thru: A Method For Removing Water From Underwater Images论文研读 目录 Sea-thru: A Method For Removing Water From Underwater Images论文研读 摘要 1.介绍 2.相关工作 3.科学背景 4.Sea-thru方法 4.1.成像和距离地图的生成 4.2.场景重建 4.3.向后散射估计…

Removing Backdoor-Based Watermarks in Neural Networks with Limited Data

Removing Backdoor-Based Watermarks in NeuralNetworks with Limited Data 寒假疯玩&#xff0c;新学期回归&#xff01;&#xff01; 这篇Removing Backdoor-Based Watermarks in Neural Networks with Limited Data是2021发在ICPR上的一篇&#xff0c;主要工作就是针对backd…

centos使用yum安装提示:removing mirrorlist with no valid mirrors

centos使用yum安装提示&#xff1a;removing mirrorlist with no valid mirrors [rootMYHOST ~]# yum list java-1.8* 已加载插件&#xff1a;fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile YumRepo Error: All mirror URLs are n…

php八字喜用神实现博客,八字中实例教你取用神

原标题&#xff1a;八字中实例教你取用神根据天干地支的组合与相互间的作用关系&#xff0c;直接提取信息。然后用生活语言表达出来&#xff0c;便完成了操作过程。因此需要你具备相对深厚的文化底蕴&#xff0c;和对生活的理解。一、感悟生活。比如说&#xff0c;你刚刚认识了…

人在洪荒,我改了亿点点天道小势(三)

“还是不够强。” 孙明看着手臂上那浅浅的白印&#xff0c;摇了摇头。 玄功六转&#xff0c;实力境界等同于太乙金仙&#xff0c;爆发战力不弱于大罗金仙。 以此类推。 玄功七转&#xff0c;境界等同大罗金仙&#xff0c;爆发战力不弱于准圣。 玄功八转&#xff0c;境界等…