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

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.hqwc.cn/news/212267.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spark的算子

spark的算子 1.spark的单Value算子 Spark中的单Value算子是指对一个RDD中的每个元素进行操作,并返回一个新的RDD。下面详细介绍一些常用的单Value算子及其功能: map:逐条映射,将RDD中的每个元素通过指定的函数转换成另一个值&am…

Laravel 安装(笔记一)

目录 第一步、Laravel 一般使用 composer安装 第二步、使用composer安装项目 第三步、配置环境 第四步、访问域名,安装完成 Laravel 官网 l​​​​​​​Installation - Laravel 中文网 为 Web 工匠创造的 PHP 框架 第一步、Laravel 一般使用 composer安装 如…

java项目之消防物资存储系统(ssm+vue)

项目简介 消防物资存储系统实现了以下功能: 管理员功能: 管理员登陆后,主要模块包括首页,个人中心,用户管理,仓库管理,物资入库管理,物资出库管理,仓库管理,物资详情管…

基于Pytest+Requests+Allure实现接口自动化测试!

一、整体结构 框架组成:pytestrequestsallure 设计模式: 关键字驱动 项目结构: 工具层:api_keyword/ 参数层:params/ 用例层:case/ 数据驱动:data_driver/ 数据层:data/ 逻辑层&…

jetson xavier NX深度学习环境配置

文章目录 jetson xavier NX深度学习环境配置1. SD卡系统烧录1.1 材料1.2 软件配置1.3 格式化SD卡1.4 系统镜像烧录 2. 环境配置2.1 cuda环境配置2.2 安装依赖库2.3 安装python及依赖环境2.4 安装pytorch环境 jetson xavier NX深度学习环境配置 1. SD卡系统烧录 1.1 材料 SD …

python opencv 放射变换和图像缩放-实现图像平移旋转缩放

python opencv 放射变换和图像缩放-实现图像平移旋转缩放 我们实现这次实验主要用到cv2.resize和cv2.warpAffine cv2.warpAffine主要是传入一个图像矩阵,一个M矩阵,输出一个dst结果矩阵,计算公式如下: cv2.resize则主要使用fx&…

CCF CSP认证 历年题目自练Day49

题目一 此题用暴力枚举做过(80分)现如今终于用二维前缀和做到满分。 试题编号: 202309-2 试题名称: 坐标变换(其二) 时间限制: 2.0s 内存限制: 512.0MB 问题描述: 问题…

内建组件和模块

讨论 Vue.js 中几个非常重要的内建组件和模块,例如 KeepAlive 组件、Teleport 组件、Transition 组件等,它们都需要渲染器级别的底层支持。另外,这些内建组件所带来的能力,对开发者而言非常重要且实用,理解它们的工作原…

计算机基础知识57

前后端数据传输的编码格式(contentType) # 我们只研究post请求方式的编码格式: get请求方式没有编码格式-- index?useranme&password get请求方式没有请求体,参数直接在url地址的后面拼接着 # 有哪些方式可以提交post请求:f…

《山水间的家》第二季收官,国台酒业解锁中国式浪漫

执笔 | 洪大大 编辑 | 萧 萧 近日,由国台酒特别支持的大型文旅探访节目《山水间的家》第二季在总台央视综合频道(CCTV-1)正式收官。 第二季节目以家庭为视角切入,先后走进江苏、四川、重庆、江西、湖北、贵州、浙江等地24个特色…

java项目之网络在线考试系统(ssm)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的网络在线考试系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: (1)登录…

关于禅道的安装配置以及项目管理、团队协同工作

目录 一、禅道是什么? 二、特点和功能 三、安装禅道 3.1 下载官网 3.2 版本考虑 3.3 禅道使用手册参考 3.4 Windows端安装禅道 四、启动禅道 4.1 访问禅道 四、禅道部分功能的使用 4.1 添加项目集 4.2 启动/关闭项目 4.3 项目计划仪表盘/阶段目标/研发…