Redis深入理解-内核请求处理流程、数据传输协议

news2024/11/15 12:13:04

Redis 内核级请求处理流程

Redis Server 其实就是 Linux 服务器中的一个进程

主要还是下图的流程

  1. 应用先和 server 端建立 TCP 连接
  2. 建立连接之后,server 端就会有一个与该客户端通信的 socket,客户端的读写请求发送到服务端的 socket
  3. 那么通过 IO 多路复用,收到读写请求的 socket 会到队列中排队等待处理
  4. 由文件事件分发器将事件分发给对应的命令请求处理器
  5. server 端内部也是有一个 Redis Client 的,由这个 Client 来处理对数据的操作,这个 Client 有一个输入缓冲区和输出缓冲区,先将读写命令写入输入缓冲区
  6. 再去找到对应的 Redis Command 也就是查找到对应的命令
  7. 之后就去操作内存中的数据
  8. 操作后将操作结果写入输出缓冲区中
  9. 最终命令请求处理器将输出缓冲区中的响应结果通过 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)

在这里插入图片描述

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

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

相关文章

C百题--3.求未知数

1.问题描述 一个正整数&#xff0c;它加上100后是一个完全平方数&#xff0c;再加上168又是一个完全平方数&#xff0c;请问该数是多少&#xff1f; 2.解决思路 遍历这个数&#xff0c;让其从1开始&#xff0c;到100000结束 3.代码实现 #include<stdio.h> #include&…

【操作系统】Bochs安装和配置

Bochs是使用C编写的高度可移植开源IA-32&#xff08;X86&#xff09;PC模拟器&#xff0c;能在大多数流行的平台上运行。它包括模拟Intel x86 CPU、常见I/O设备和自定义BIOS。Bochs可以被编译以模拟许多不同的x86 CPU&#xff0c;从386早期到最新的x86-64英特尔和AMD处理器甚至…

区间第k小数 (可持久化线段树、主席树)

题意&#xff1a;多次询问&#xff0c;每次询问某区间的第k小数。 可持久化线段树&#xff1a; 掺杂了一点前缀和的思想&#xff0c;对于每一个1 ~ i 的区间都建一个树&#xff0c;每个节点存的都是一个线段树&#xff0c;值存的是当前区间中初始数组按大小排序后[l, r]之间的…

Shopee本土号封号几率大吗?如何避免封号?被封号了怎么办?

Shopee是近几年热门的电商平台之一&#xff0c;即使越来越多的跨境电商涌现&#xff0c;他的地位在东南亚市场依然占据一席之地&#xff0c;也依旧吸引着需要跨境商家入局。尤其在2023年&#xff0c;在TikTok Shop在印尼被关停之后&#xff0c;留下了大片空白&#xff0c;Shope…

如何解决tinder注册失败的问题?

tinder创立在2012年&#xff0c;是一款海外热门的交友软件。2020年&#xff0c;Tinder拥有620万用户和7500万月活跃用户。截至2021年&#xff0c;Tinder在全球范围内的匹配记录超过650亿。已成为全球最受欢迎的约会软件之一。 目前tinder暂时未对中国大陆开发使用&#xff0c;…

Python入门教程 | Python3 字典(dict)

Python3 字典 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 Python3中的字典是一种无序、可变、可迭代的数据结构&#xff0c;它由键&#xff08;key&#xff09;和对应的值&#xff08;value&#xff09;组成。字典在Python中被视为可变对象&#xff0c;这意…

多级缓存快速上手

哈喽~大家好&#xff0c;这篇来看看多级缓存。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【微服务】 &#x1f949;与这篇相关的文章&#xff1a; JAVA进程和线程JAVA进程和线程-CSDN博客Http…

【数据结构/C++】栈和队列_链队列

#include <iostream> using namespace std; // 链队列 typedef int ElemType; typedef struct LinkNode {ElemType data;struct LinkNode *next; } LinkNode; typedef struct {LinkNode *front, *rear; } LinkQueue; // 初始化 void InitQueue(LinkQueue &Q) {Q.fron…

Redis深入理解-Socket连接建立流程以及文件事件处理机制

Redis Server 运行原理图 Redis 服务器中 Socket 网络建立以及文件事件模型 一个 redis 单机&#xff0c;可以抗几百上千的并发&#xff0c;这里的并发指的就是同时可以有几百个 client 对这个 redis server 发起请求&#xff0c;都需要去建立网络连接&#xff0c;同时间可能会…

Attention is All You Need:Transformer各模块详解

Transformer encoder-decoder架构 Encoder&#xff1a;将输入序列转换为一个连续向量空间中的表示。Encoder通常是一个循环神经网络&#xff08;RNN&#xff09;或者卷积神经网络&#xff08;CNN&#xff09;&#xff0c;通过对输入序列中的每个元素进行编码&#xff0c;得到…

SQLite3 数据库学习(六):Qt 嵌入式 Web 服务器详解

参考引用 SQLite 权威指南&#xff08;第二版&#xff09;SQLite3 入门 1. Apache 搭建 cgi 环境 1.1 什么是 Apache Apache 是世界使用排名第一的 Web 服务器软件 它可以运行在几乎所有广泛使用的计算机平台上&#xff0c;由于其跨平台和安全性被广泛使用 1.2 具体搭建流程…

代码随想录算法训练营Day 59 || 503.下一个更大元素II、42. 接雨水

503.下一个更大元素II 力扣题目链接(opens new window) 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更…

数据中台建设方法论

1、数仓的概念和了解--业务的痛点 产生的痛点&#xff1a;数据资产比较模糊、数据的质量比较低、重复建设、代码的耦合性比较强。 2、数据仓库中的常见的模型&#xff1a; 1、心型模型&#xff1a;中间是一张事实表&#xff0c;周围都是维度表。 对于心型模型的主要的特点&a…

可上手 JVM 调优实战指南

文章目录 为什么要学 JVM一、JVM 整体布局二、Class 文件规范三、类加载模块四、执行引擎五、GC 垃圾回收1 、JVM内存布局2 、 JVM 有哪些主要的垃圾回收器&#xff1f;3 、分代垃圾回收工作机制 六、对 JVM 进行调优的基础思路七、 GC 情况分析实例八、最后总结 全程可上手JVM…

快速了解敏捷测试!解密敏捷测试的难点!

随着敏捷开发模式的普及&#xff0c;越来越多的测试同仁也开始了敏捷测试。那么究竟什么是敏捷测试&#xff1f;敏捷测试与传统测试的主要区别是什么&#xff1f;敏捷测试的难点又是什么&#xff1f;本文会对这三个问题进行讲解。注意&#xff1a;本文只是讲解敏捷测试概念相关…

String 、StringBuffer 和 StringBuilder 的区别?

String 使用 String 声明一个字符串的时候&#xff0c;该字符串会存放在堆中的字符串常量池中。因为在java中所有的String 都是以常量表示&#xff0c;且由 final 修饰&#xff0c;因此在线程池中它的线程是安全的 且 不可变的 。每个 String 在被创建后就不再发生任何变化。 …

新王加冕,GPT-4V 屠榜视觉问答

当前&#xff0c;多模态大型模型&#xff08;Multi-modal Large Language Model, MLLM&#xff09;在视觉问答&#xff08;VQA&#xff09;领域展现了卓越的能力。然而&#xff0c;真正的挑战在于知识密集型 VQA 任务&#xff0c;这要求不仅要识别视觉元素&#xff0c;还需要结…

【SpringMVC】 对请求的不同响应

前言 本文学习如何运用不同的注解来返回不同的响应. 1.返回静态页面Controller 返回index.html页面 Controller 和 RestController的区别 controller 只有加上这个注解,Spring才会帮我们管理这个代码.后续我们访问时才能访问到. RestController 等同于 Controller ResponseBo…

前端学习--React(3)

一、Redux 集中状态管理工具&#xff0c;不需要react即可使用&#xff0c;每个store的数据都是独立于组件之外的 vue小链接&#xff1a;vuex/pinia 基本使用 Redux将数据修改流程分成三个概念&#xff0c;state、action和reducer state - 一个对象 存放我们管理的数据状态 a…