Redis协议的请求和响应有哪些“套路”可循?no.18

news2024/11/17 7:52:34

Redis 协议

Redis 支持 8 种核心数据结构,每种数据结构都有一系列的操作指令,除此之外,Redis 还有事务、集群、发布订阅、脚本等一系列相关的指令。为了方便以一种统一的风格和原则来设计和使用这些指令,Redis 设计了 RESP,即 Redis Serialization Protocol,中文意思是 Redis 序列化协议。RESP 是二进制安全协议,可以供 Redis 或其
他任何 Client-Server 使用。在 Redis 内部,还会基于 RESP 进一步扩展细节。

设计原则
Redis 序列化协议的设计原则有三个:

  • 第一是实现简单;
  • 第二是可快速解析;
  • 第三是便于阅读。

Redis 协议的请求响应模型有三种,除了 2 种特殊模式,其他基本都是 ping-pong 模式,即 client 发送一个请求,server 回复一个响应,一问一答的访问模式。

2 种特殊模式:

  • pipeline 模式,即 client 一次连续发送多个请求,然后等待 server 响应,server 处理完请求后,把响应返回给 client。
  • pub/sub 模式。即发布订阅模式,client 通过 subscribe 订阅一个 channel,然后 client 进入订阅状态,静静等待。当有消息产生时,server 会持续自动推送消息给 client,不需要 client 的额外请求。而且客户端在进入订阅状态后,只可接受订阅相关的命令如 SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE 和 PUNSUBSCRIBE,除了这些命令,其他命令一律失效。

Redis 协议的请求和响应也是有固定套路的。

对于请求指令,格式有 2 种类型。

  1. 当你没有 redis-client,但希望可以用通用工具 telnet,直接与 Redis 交互时,Redis 协议虽然简单易于阅读,但在交互式会话中使用,并不容易拼写,此时可以用第一种格式,即 inline cmd 内联命令格式。使用 inline cmd 内联格式,只需要用空格分隔请求指令及参数,简单快速,一个简单的例子如 mget key1 key2\r\n。
  2. 第二种格式是 Array 数组格式类型。请求指令用的数组类型,与 Redis 响应的数组类型相同,后面在介绍响应格式类型时会详细介绍。

响应格式

Redis 协议的响应格式有 5 种,分别是:

  1. simple strings 简单字符串类型,以 + 开头,后面跟字符串,以 CRLF(即 \r\n)结尾。这种类型不是二进制安全类型,字符串中不能包含 \r 或者 \n。比如许多响应回复以 OK 作为操作成功的标志,协议内容就是 +OK\r\n 。
  2. Redis 协议将错误作为一种专门的类型,格式同简单字符串类型,唯一不同的是以 -(减号)开头。Redis 内部实现对 Redis 协议做了进一步规范,减号后面一般先跟 ERR 或者 WRONGTYPE,然后再跟其他简单字符串,最后以 CRLF(回车换行)结束。这里给了两个示例,client 在解析响应时,一旦发现 - 开头,就知道收到 Error 响应。
  3. Integer 整数类型。整数类型以 :开头,后面跟字符串表示的数字,最后以回车换行结尾。Redis 中许多命令都返回整数,但整数的含义要由具体命令来确定。比如,对于 incr 指令,:后的整数表示变更后的数值;对于 llen 表示 list 列表的长度,对于 exists 指令,1 表示 key 存在,0 表示 key 不存在。这里给个例子,:后面跟了个 1000,然后回车换行结束。
  4. bulk strings 字符串块类型。字符串块分头部和真正字符串内容两部分。字符串块类型的头部, 为 ( 开头,随后跟真正字符串内容的字节长度,然后以 CRLF 结尾。字符串块的头部之后,跟随真正的字符串内容,最后以 CRLF 结束字符串块。字符串块用于表示二进制安全的字符串,最大长度可以支持 512MB。一个常规的例子,“)6\r\nfoobar\r\n”,对于空字串,可以表示为 “(0\r\n\r\n”,NULL字串: “)-1\r\n”。
  5. Arrays 数组类型,如果一个命令需要返回多条数据就需要用数组格式类型,另外,前面提到 client 的请求命令也是主要采用这种格式。

Arrays 数组类型,以 * 开头,随后跟一个数组长度 N,然后以回车换行结尾;然后后面跟随 N 个数组元素,每个数组元素的类型,可以是 Redis 协议中除内联格式外的任何一种类型。

比如一个字符串块的数组实例,*2\r\n(3\r\nget\r\n)3\r\nkey\r\n。整数数组实例:”*3\r\n:1\r\n:2\r\n:3\r\n”,混合数组实例:”*3\r\n :1\r\n-Bar\r\n$6\r\n foobar\r\n”,空数组:”0\r\n”,NULL数组:”-1\r\n”。

协议分类

Redis 协议主要分为 16 种,其中 8 种协议对应前面我们讲到的 8 种数据类型,你选择了使用什么数据类型,就使用对应的响应操作指令即可。剩下 8 种协议如下所示。

  1. pub-sub 发布订阅协议,client 可以订阅 channel,持续等待 server 推送消息。
  2. 事务协议,事务协议可以用 multi 和 exec 封装一些列指令,来一次性执行。
  3. 脚本协议,关键指令是 eval、evalsha 和 script等。
  4. 连接协议,主要包括权限控制,切换 DB,关闭连接等。
  5. 复制协议,包括 slaveof、role、psync 等。
  6. 配置协议,config set/get 等,可以在线修改/获取配置。
  7. 调试统计协议,如 slowlog,monitor,info 等。
  8. 其他内部命令,如 migrate,dump,restore 等。

Redis client 的使用及改进

由于 Redis 使用广泛,几乎所有主流语言都有对 Redis 开发了对应的 client。以 Java 语言为例,广泛使用的有 Jedis、Redisson 等。对于 Jedis client,它的优势是轻量,简洁,便于集成和改造,它支持连接池,提供指令维度的操作,几乎支持 Redis 的所有指令,但它不支持读写分离。Redisson 基于 Netty 实现,非阻塞 IO,性能较高,而且支持异步请求和连接池,还支持读写分离、读负载均衡,它内建了 tomcat Session ,支持 spring session 集成,但 redisson 实现相对复杂。

在新项目启动时,如果只是简单的 Redis 访问业务场景,可以直接用 Jedis,甚至可以简单封装 Jedis,实现 master-slave 的读写分离方案。如果想直接使用读写分离,想集成 spring session 等这些高级特性,也可以采用 redisson。

Redis client 在使用中,需要根据业务及运维的需要,进行相关改进。在 client 访问异常时,可以增加重试策略,在访问某个 slave 异常时,需要重试其他 slave 节点。需要增加对 Redis 主从切换、slave 扩展的支持,比如采用守护线程定期扫描 master、slave 域名,发现 IP 变更,及时切换连接。对于多个 slave 的访问,还需要增加负载均衡策略。最后,Redis client 还可以与配置中心、Redis 集群管理平台整合,从而实时感知及协调 Redis 服务的访问。

至此,本节课的内容就讲完了。

在这几节课中,你首先学习了 Redis 的特性及基本原理,初步了解了 Redis 的数据类型、主进程/子进程、BIO 线程、持久化、复制、集群等;这些内容会在后续逐一深入学习。

然后,详细学习了 Redis 的数据类型,了解了字符串、列表、集合、有序集合、哈希、位图、GEO 地理位置、HyperLogLog 基数统计,这 8 种核心数据类型的功能、特点、主要操作指令及应用场景。

接下来,你还熟悉了 Redis 协议,包括 Redis 协议的设计原则、三种响应模型,2 种请求格式和 5 种响应格式。

最后,以 Java 语言为例,你还了解了 Redis client 的对比、选择及改进。

你可以参考这个思维导图,对这些知识点进行回顾和梳理。

在这里插入图片描述

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

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

相关文章

适用于Windows 电脑的最佳视频恢复软件和方法

毫无疑问,丢失您的基本数据总是有压力的,尤其是当这些是您为捕捉最美好回忆而收集的重要视频文件时。要恢复丢失或损坏的视频文件,您可以借助视频恢复工具。但是,在选择最佳视频恢复工具时,您必须考虑多个扫描选项&…

Linux .eh_frame section以及libunwind

文章目录 前言一、LSB二、The .eh_frame section2.1 简介2.2 The Common Information Entry Format2.1.1 Augmentation String Format 2.3 The Frame Description Entry Format 三、The .eh_frame_hdr section四、libunwind五、基于Frame Pointer和基于unwind 形式的栈回溯比较…

紫光展锐突破创新终端品类,搭载展锐芯的全球首款二合一5G云电脑正式发布

近日,搭载紫光展锐5G芯片T760的中兴云电脑逍遥系列正式发布,亮点: 全球首款二合一5G云电脑,支持本地/云端双模式,一键切换,用户可同时享有Android平板和Windows云电脑两种形态;支持5G蜂窝网络&…

LLama3 | 一. 本地 Web Demo 部署

前置工作 课程文档:Llama3-Tutorial/docs/hello_world.md at main SmartFlowAI/Llama3-Tutorial GitHub 1.安装vscode 2.安装vscode插件 Remote SSH 3.配置 VSCode 远程连接开发机 ssh连接开发机 进行端口映射 在开发机控制台中点击自定义服务,复…

DeepDriving | CUDA编程-02: 初识CUDA编程

本文来源公众号“DeepDriving”,仅用于学术分享,侵权删,干货满满。 原文链接:CUDA编程-02: 初识CUDA编程 上一篇文章DeepDriving | CUDA编程-01: 搭建CUDA编程环境-CSDN博客介绍了如何搭建CUDA编程环境&a…

阿里云数据库 SelectDB 版全面商业化,开启现代化实时数据仓库的全新篇章

2024 年 5 月 21 日,由阿里云联合飞轮科技共同举办的「阿里云数据库 SelectDB 版商业化产品发布会」于线上召开。阿里巴巴集团副总裁、阿里云数据库产品事业部负责人李飞飞宣布,阿里云数据库 SelectDB 版在中国站及国际站全面发布,正式开启商…

5. JVM面试题汇总

Java全栈面试题汇总目录-CSDN博客 1. 说一下JVM的主要组成部分及其作用? JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。 Cl…

Kibanna安装配置

环境:windows10、ES(8.13.3)、Kibana(8.13.3)、Logstash(8.13.3) 1.Kibanna安装配置 Kibanna对ES的数据进行可视化、分析和监控 Download Kibana Free | Get Started Now | ElasticDownload K…

零部件销售|基于SSM+vue的轻型卡车零部件销售平台系统的设计与实现(源码+数据库+文档)

轻型卡车零部件销售平台 目录 基于SSM+vue的轻型卡车零部件销售平台系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户后台功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

MavLinK协议

由于在公司需要使用这个,我就写一个文章用于入门级别 简单介绍 MAVSDK是PX4开源团队贡献的基于mavlink通信协议的用于无人机应用开发的SDK,其可以部署在Windows、Linux、Android等多种平台,并且支持多种语言如c/c、python、Java等。 在官网…

5月30日在线研讨会 | 面向智能网联汽车的产教融合解决方案

随着智能网联汽车技术的快速发展,产业对高素质技术技能人才的需求日益增长。为了促进智能网联汽车行业的健康发展,推动教育链、人才链与产业链、创新链的深度融合,经纬恒润推出产教融合相关方案,旨在通过促进教育链与产业链的深度…

XV4001KD汽车级应用的数字输出陀螺传感器

XV4001KD是一款专为汽车导航系统和远程信息处理而设计的数字输出陀螺传感器。采用SPI/I2C串行接口,具有高精度的16位的角速率输出和11位的温度输出功能,能够准确地测量车辆的运动状态和环境温度,为导航系统和信息处理提供可靠的数据支持。以及…

深度学习基础之《TensorFlow框架(18)—卷积神经网络(2)》

一、卷积层 1、卷积层(Convolutional Layer)介绍 卷积神经网络中每层卷积层由若干卷积单元(卷积核)组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的 卷积运算的目的是特征提取,第一层卷积层可能…

word页眉线如何置于文字上方

然后 敲黑板,点这里

学硕都考11408的211院校!河北工业大学计算机考研考情分析!

河北工业大学(Hebei University of Technology),简称河北工大,坐落于天津市,由河北省人民政府、天津市人民政府与中华人民共和国教育部共建, 隶属于河北省,是国家“双一流”建设高校、国家“211…

Linux磁盘高级操作

RAID RAID存储系统是一种数据存储虚拟化技术,它将多个物理磁盘驱动器组合成一个或多个逻辑单元,以提供数据冗余和/或提高性能。 1. RAID 0 无奇偶校验与冗余(磁盘容错)的条带存储(带区卷/条带卷) 由两块…

科技巨头的下一个目标:Web3与物联网融合

引言 随着技术的不断演进和创新,科技巨头们正在将目光聚焦到Web3与物联网的融合领域,这将开启一个全新的数字时代。本文将深入探讨科技巨头们在这一领域的动向,以及融合可能带来的影响和未来发展方向。 Web3与物联网的融合趋势 技术发展的趋…

【手写大跟堆详解】

文章目录 大跟堆介绍大跟堆的结构大跟堆的应用场景大跟堆的代码实现 大跟堆介绍 大根堆(Max Heap)是一种特殊的二叉树结构,它满足以下两个条件: 1.完全二叉树:大根堆是一棵完全二叉树,即除了最后一层外&am…

Web Server项目实战4-服务器编程基本框架和2种高效的事件处理模式

服务器编程基本框架 虽然服务器程序种类繁多,但其基本框架都一样,不同之处在于逻辑处理 模块功能I/O处理单元处理客户连接,读写网络数据逻辑单元业务进程或线程网络存储单元数据库、文件或缓存请求队列各单元之间的通信方式 I/O 处理单元是…

520主题趣味小游戏玩法线上互动的作用是什么

行业商家借势520气氛,往往能低成本达到预期效果,包括但不限于品牌传播、渠道引流涨粉、用户促活引导等,除了前面推荐的互动玩法外,在【雨科】平台的这几款520趣味小游戏同样值得关注。 1、爱你不止520 这是一款九宫格抽奖活动&am…