Redis深入理解-内核请求处理流程、数据传输协议
Redis 内核级请求处理流程
Redis Server 其实就是 Linux 服务器中的一个进程
主要还是下图的流程
- 应用先和 server 端建立 TCP 连接
- 建立连接之后,server 端就会有一个与该客户端通信的 socket,客户端的读写请求发送到服务端的 socket
- 那么通过 IO 多路复用,收到读写请求的 socket 会到队列中排队等待处理
- 由文件事件分发器将事件分发给对应的命令请求处理器
- server 端内部也是有一个 Redis Client 的,由这个 Client 来处理对数据的操作,这个 Client 有一个输入缓冲区和输出缓冲区,先将读写命令写入输入缓冲区
- 再去找到对应的 Redis Command 也就是查找到对应的命令
- 之后就去操作内存中的数据
- 操作后将操作结果写入输出缓冲区中
- 最终命令请求处理器将输出缓冲区中的响应结果通过 Socket 发送给客户端
Redis 数据传输协议
参考文章:https://redis.com.cn/topics/protocol.html
Redis客户端和服务器端通信使用名为 RESP (REdis Serialization Protocol) 的协议。虽然这个协议是专门为Redis设计的,它也可以用在其它 client-server 通信模式的软件上。
该协议用于 Redis 客户端和服务端之间进行通信
RESP 协议格式:
- 单行字符串(Simple Strings): 响应的首字节是
+
- 错误(Errors): 响应的首字节是
-
- 整型(Integers): 响应的首字节是
:
- 多行字符串(Bulk Strings): 响应的首字节是
$
- 数组(Arrays):响应的首字节是
*
RESP 协议的每一个部分都是以 \r\n
结束,也就是换行结束
AOF 持久化文件中存储的数据也是 RESP 协议的数据格式。
RESP 协议优点:
-
实现简单,容易解析
redis 的 set key value 命令转为 RESP 协议数据如下: *3 $3 SET $3 key $5 value
-
RESP 是二进制安全的,因为使用了前缀长度来传输大量数据,因此不需要去检查内容中是否存在特殊字符
Redis 内核中的请求数据结构
Redis 协议说明文档:http://www.redis.cn/topics/protocol.html
# *3 表示有 3 个命令字符串
# $3 表示长度
# \r\n 也就是换行操作
*3\r\n$3\r\nSET\r\n$3\r\nkey\r\j$5\r\nvalue\r\n# 把\r\n翻译成换行,数据就为下边这个样子
*3
$3
SET
$3
key
$5
value
对于 set key value
命令来说,通过协议组织成上边的数据,那么从 client 端发送到 server 需要序列化成字节数据流,之后再通过 socket 进行传输,server 端收到字节流数据之后,会进行反序列化,将字节流数据转为了 *3\r\n$3\r\nSET\r\n$3\r\nkey\r\j$5\r\nvalue\r\n
,这个数据就会被放到 server 端的 RedisClient 的输入缓冲区中
那么这个协议数据在 server 中的 Redis Client 中,就会被解析成 argv 的一个参数,也就是具体的命令,如下图:
那么在 argv 中就解析出来了真正需要执行的命令了,下一步就要执行对应的命令了
Redis 内核中命令函数的查找
在 Redis Server 中将所有的命令都放在了一个命令查找表
中,那么在上边的 argv 中拿到了命令的名称,就可以去命令查找表中去查找对应的 RedisCommand,在 Redis Client 的输入缓冲区中有一个变量 cmd
就会去指向该命令所对应的 RedisCommand,之后就可以真正的去调用命令函数,来操作 Redis 中的内存数据结构,之后将操作的结果还是按照 Redis 的协议给放入到 Redis Client 的输出缓冲区中,之后就可以通过 Socket 将结果返回给客户端了
Redis Server 启动流程分析
Redis 我们作为缓存使用比较多
其实 Redis 本质上是一个基于内存的 Nosql 数据存储服务,只是因为 Redis 是基于内存进行操作,比较快,所以我们用来做缓存
那么 Redis Server 基于内存操作,如果 Redis 重启之后,内存中的数据就会丢失,所以 Redis 还需要进行持久化的一个操作
那么持久化就分为了 RDB 和 AOF,RDB 的话是周期性将内存中的全量数据都给复制到磁盘中(存储文件为压缩的二进制文件),适合做数据的冷备份,放到其他服务器的磁盘上去,如果当前服务器磁盘损坏,就可以从其他服务器读取该 RDB 文件,恢复 Redis 中的内存数据
一般使用 AOF 来做数据的持久化,用 RDB 做一个周期性的冷备份
AOF 将内存数据同步到磁盘中,一般采用每秒同步一次,如果同步频率过高,就会导致 Redis 性能退化,当 Redis 突然宕机,可能会丢失 1s 内的内存数据,那么在 redis-server 进程重启时,就会把磁盘存储的 aof 文件的数据给读取到内存中,还原 Redis 上次运行时的内存情况
Redis 为什么需要分布式集群模式?
单台 Redis 瓶颈在哪里?
在于内存,每一台机器的内存是有限的,所以如果数据量很大的情况下,一台 Redis 就不够用了,因此需要分布式集群模式
在分布式集群模式中,就可以让每一个节点存储一部分的数据,来降低内存容量对于 Redis 的影响
Redis 分布式集群模式下内核中的数据结构
Redis Server 在分布式模式下,需要存储哪些内容的?
主要是存储集群的状态(state)以及集群中的节点(nodes),以及当前节点的一个角色(myself)
相关文章:

Redis深入理解-内核请求处理流程、数据传输协议
Redis 内核级请求处理流程 Redis Server 其实就是 Linux 服务器中的一个进程 主要还是下图的流程 应用先和 server 端建立 TCP 连接建立连接之后,server 端就会有一个与该客户端通信的 socket,客户端的读写请求发送到服务端的 socket那么通过 IO 多路…...
Mac电脑卸载/删除nodejs
使用命令行卸载 Node.js 第一步:打开终端,输入以下命令显示 Node.js 的安装路径: which node执行该命令后,会显示安装路径: /usr/local/bin/node第二步:输入以下命令删除 Node.js 相关的文件:…...

C语言之内存函数
C语言之内存函数 文章目录 C语言之内存函数1. memcpy 使⽤和模拟实现1.1 memcpy 函数的使用1.3 memcpy的模拟实现 2. memmove 使⽤和模拟实现2.1 memmove 函数的使用2.2 memmove的模拟实现 3. memset 函数的使用4. memcmp 函数的使⽤ 1. memcpy 使⽤和模拟实现 函数声明如下&a…...

基本数据结构二叉树(1)
目录 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树: 2.3 特殊的二叉树: 2.5 二叉树的存储结构 2. 链式存…...

【python】Python将100个PDF文件对应的json文件存储到MySql数据库(源码)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...
Android:Google三方库之Adjust集成详细步骤
通过 Adjust 安卓 SDK,您可以在自己的安卓应用中跟踪归因、事件及更多数据。请按照本指南中说明的步骤操作,在应用内设置 Adjust SDK 1、添加依赖 //adjustimplementation("com.adjust.sdk:adjust-android:4.33.5")implementation("com.…...

prometheus|云原生|grafana-9.4.3版本的主题更改
一, grafana-9.4.3版本的主题更改 grafana-9.4.3版本应该是目前比较高的版本了,但不知道是什么原因,grafana的主题界面并不多,只有暗色,亮色和系统色三种 配置管理----首选项里可以看到 亮色: 暗色&…...

B033-Servlet交互 JSP
目录 ServletServlet的三大职责跳转:请求转发和重定向请求转发重定向汇总请求转发与重定向的区别用请求转发和重定向完善登录 JSP第一个JSP概述注释设置创建JSP文件默认字符编码集 JSP的java代码书写JSP的原理三大指令九大内置对象改造动态web工程进行示例内置对象名…...

Less 安装教程
文章目录 前言LESS的系统要求安装LESS例子输出Less编译css工具后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Sass和Less 🐱👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板…...

Java研学-多线程
一 名词解析 1 线程 : 控制指定APP(进程)执行的最基本单元(最小单位) 2 进程 : 硬件设备上的每一个应用程序 3 单线程 : 一个进程中只有一个线程执行,实际上基本没有这种情况 4 多线程 : 一个进程中至少有两个或两个以上的线程在执行 二 创建方式 1 共有三种:Thread类. R…...

【日常总结】如何禁止浏览器 http自动跳转成https
一、场景 二、问题 三、解决方案 3.1 chrome 浏览器 3.2 edge 浏览器: 3.3 Safari 浏览器 3.4 Firefox 浏览器 3.5 Microsoft Edge 一、场景 公司网站 http:// 谷歌浏览器中自动转换成 https:// 导致无法访问 二、问题 nginx配置ssl 443接口, ht…...

文本转语音:微软语音合成标记语言 (SSML) 文本结构和事件
SSML 的语音服务实现基于万维网联合会的语音合成标记语言版本 1.0。 语音服务支持的元素可能与 W3C 标准不同。 每个 SSML 文档是使用 SSML 元素(或标记)创建的。 这些元素用于调整语音、风格、音节、韵律、音量等。 下面是 SSML 文档的基本结构…...

计算机网络之物理层(数据通信有关)
一、概述 1.1物理层引入的目的 屏蔽掉传输介质的多样性,导致数据传输方式的不同;物理层的引入使得高层看到的数据都是统一的0,1构成的比特流 1.2.物理层如何实现屏蔽 物理层靠定义的不同的通信协议(一般称通信规程) 这些协议…...
安卓开发之HTTP API服务接口设计(基于okhttp3请求)
安卓中的请求 OkHttp3 是一个开源的 Java/Android HTTP 客户端库,由 Square 公司开发。它提供了简洁和高效 的 API ,用于进行 HTTP 请求、处理响应以及与服务器进行通信。 以下是 OkHttp3 的一些主要特点和功能: 简单易用: OkHttp3 提供了简洁的 API ,使得发送 HTTP 请求变…...

我的第一次SACC之旅
今年有很多第一次,第一次作为“游客”参加DTCC(中国数据库大会),第一次作为讲师参与ACDU中国行(成都站),第一次参加OB年度发布会(包含DBA老友会),而这次是第一…...
Codeforces Round 908 (Div. 2)
Codeforces Round 908 (Div. 2) 文章目录 Codeforces Round 908 (Div. 2)ABCD A 获取对战的最后一个即为胜者 #include <bits/stdc.h>using namespace std;void solve() {int n;cin >> n;string s;cin >> s;cout << s[n-1] << endl; }int main…...

Java实现-数据结构 2.时间和空间复杂度
.如何衡量一个算法的好坏:时间复杂度和空间复杂度 算法效率分为时间效率和空间效率,时间效率称为时间复杂度,空间效率称为空间复杂度 时间复杂度 算法的时间复杂度是一个数学函数,它描述了算法的运行时间,一个算法执…...
Docker exec命令
docker exec :在运行的容器中执行命令。 语法: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]OPTIONS说明: -d:分离模式: 在后台运行 -i:即使没有附加也保持STDIN打开 -t:分配一个伪终…...

可燃气体监测仪助力燃气管网安全监测,效果一览
城市地下管线是指城市范围内供应水、排放水、燃气等各类管线及其附属设施,它们是保障城市正常运转的重要基础设施且影响着城市生命线。其中燃气引发的事故近些年不断增加,由于燃气管线深埋地下环境复杂,所以仅仅依赖人工巡查难以全面有效地防…...
Kafka(二)在WSL搭建Schema Registry
目录 1 Avro与Schema Registry2 搭建Schema Registry2.1 下载Confluent并解压2.2 设置环境变量2.3 修改配置2.4 启动服务 3 API列表 1 Avro与Schema Registry Apache Avro 是一种高效的数据序列化系统,用于在不同的应用程序和平台之间传输和存储数据。它提供了一种…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...