大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用

news2024/9/22 5:23:50

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (正在更新…)

章节内容

上节我们完成了:

  • Redis的缓存机制
  • Redis的淘汰策略
  • LRU LFU 等机制

在这里插入图片描述

通信协议

  • Redis是单进程+单线程的。
  • 应用系统和Redis之间是通过Redis协议(RESP)来进行交互的。

响应模式

概念介绍

Redis 协议位于 TCP 层上,即客户端和Redis实例保持双工的连接。
在这里插入图片描述

串行模式

  • 串行化是最简单的模式,客户端与服务端建立长连接。
  • 连接通过心跳机制来检测(ping-pong)ACK应答。
  • 客户端发送请求,服务端响应,客户端收到响应后,再发起第二个请求,服务端再响应。
  • telnet 和 redis-cli 都属于这种模式,耗时在网络传输且性能较低

在这里插入图片描述

双工模式

批量请求,批量响应,请求和响应交叉进行,不会混淆(TCP双工)

  • pipline 的作用是将一批命令进行打包,然后发送给服务器,服务器执行完后按顺序打包返回。
  • 通过pipline,一次pipline中包含多条命令+一次网络时间

我们使用Jedis库可以很轻松的使用 pipline

Jedis redis = new Jedis("h121.wzk.icu", 6379);
redis.auth("111111");
Pipeline pipe = jedis.pipelined();
for (int i = 0; i <50000; i++) {
    pipe.set("key_"+String.valueOf(i),String.valueOf(i));
}
// 将封装后一次性发给redis
pipe.sync();

数据格式

Redis 客户端与服务器交互采用序列化协议(RESP)。
请求以字符串的形式来表示要执行的命令的参数
Redis使用特有的数据类型作为回复。

  • 客户端与服务端通过TCP连接来进行数据交互,服务端口号为:6379
  • 客户端与服务端发送的命令和数据一律以 \r\n(CRLF)结尾
  • 所有参数都是二进制安全(binary safe)

内联格式

可以使用 telnet 工具进行测试,发送一些内容过去

telnet h121.wzk.icu 6379

xxx
xxx
xxx

处理流程

处理流程

  • 服务器启动监听
  • 接受命令请求并解析
  • 执行命令请求
  • 返回命令回复

具体的过程图可以看下边的流程图片:
在这里插入图片描述

处理机制

Redis 服务器是典型的事件驱动系统,Redis将事件分为两大类:

  • 文件事件
  • 时间事件

文件事件

文件事件即Socket读写事件,也就是IO事件,比如客户端连接、命令请求、数据回复、连接断开等等。

Reactor

Redis 事件处理机制采用单线程的Reactor模式,属于 I/O 多路复用的一种常见模式。
IO 多路复用指单个线程管理多个Socket,Reactor Pattern(反应器设计模式)是一种为处理并发服务请求,并将请求提交到一个或者多个服务器处理的事件设计模式。

  • Reactor 模式是事件驱动的
  • 有一个或者多个并发输入源
  • 有一个ServiceHandler
  • 有多个RequestHandlers
  • ServiceHandler会同步的将输入的Event多路复用的分发给相应的RequestHandler

下面这些图片可以让你更好地理解 Reactor 模式:
在这里插入图片描述
在这里插入图片描述

多路复用

IO多路复用机制就是通过一种机制,一个进程可以监视多个描述符(Socket),一旦某个描述符就绪,能够通知程序进行相应的复写操作。
IO多路复用机制有这么几种:

  • select
  • poll
  • epoll
  • kqueue

Select

select函数监视的文件描述符分3类:

  • writefds
  • readfds
  • exceptfds

调用后select函数会阻塞,直到有描述符就绪或者超时,函数返回。
当select函数返回后,可以通过 fd 列表遍历,来找到就绪的描述符。

Select优点

几乎在所有平台上都有支持,跨平台支持。

Select缺点

单个进程打开文件描述有一定的限制,有 FD_SETSIZE 设置,默认是 1024 ,采用数组存储,另外在检查数组中是否有文件描述符需要读写时,采用的是线性的扫描(不管是否活跃都扫描轮询),效率较低。

Poll

poll使用一个 pollfd 的指针实现,pollfd结构包含了要监视的 Event 和 发生的 Event,不再使用 select 的参数值传递的方式。

Poll 优点

采用链表的形式存储,它监听的描述符数量没有限制,可以超过select默认限制的1024大小

Poll缺点

另外在检查链表中是否有文件描述符需要读写时,采用线性扫描的方法,即不管Socket是不是活跃的,都轮询一次,效率较低。

epoll

epoll 子啊 Linux2.6 内核中提出的,是之前 select 和 poll 的加强版本。
相对于 select 和 poll 来说,epoll 更加灵活,没有描述符限制。

epoll 使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy就只需要一次。

epoll优点

epoll 没有最大并发连接限制,上限是最大能打开文件的数目,比如1GB内存大约能打开10万文件左右。
epoll 最大的优点就在于只处理活跃的连接,而不需要轮询遍历,所以效率很高。

kqueue

kqueue 是 unix 下的一个 IO 多路复用库。最初是 2000年在FreeBSD系统上开发的一个高性能的事件的事件通知接口。
注册一批Socket描述符kqueue后,当其中描述符状态发生改变时,kqueue将一次性通知应用程序哪些描述符可读可写或出错。

kqueue优点

能处理大量数据,性能较高。

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

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

相关文章

鸿蒙开发仓颉语言【Hyperion: 一个支持自定义编解码器的TCP通信框架】组件

Hyperion: 一个支持自定义编解码器的TCP通信框架 特性 支持自定义编解码器高效的ByteBuffer实现&#xff0c;降低请求处理过程中数据拷贝自带连接池支持&#xff0c;支持连接重建、连接空闲超时易于扩展&#xff0c;可以积木式添加IoFilter处理入栈、出栈消息 组件 hyperio…

c++ 求解质因数

定义 这里先来了解几个定义&#xff08;如已了解&#xff0c;可直接看下一个板块&#xff09; 因数&#xff1a;又称为约数&#xff0c;如果整数a除以整数b&#xff08;b0&#xff09;的商正好是是整数而没有余数&#xff0c;我们就说b是a的因数 质数&#xff1a;又称为素数…

我在Vscode学Java泛型(泛型设计、擦除、通配符)

Java泛型 一、泛型 Generics的意义1.1 在没有泛型的时候&#xff0c;集合如何存储数据1.2 引入泛型的好处1.3 注意事项1.3.1 泛型不支持基本数据类型1.3.2 当泛型指定类型&#xff0c;传递数据时可传入该类及其子类类型1.3.3 如果不写泛型&#xff0c;类型默认是Object 二、泛型…

Python酷库之旅-第三方库Pandas(044)

目录 一、用法精讲 151、pandas.Series.any方法 151-1、语法 151-2、参数 151-3、功能 151-4、返回值 151-5、说明 151-6、用法 151-6-1、数据准备 151-6-2、代码示例 151-6-3、结果输出 152、pandas.Series.autocorr方法 152-1、语法 152-2、参数 152-3、功能 …

c++树(三)重心

目录 重心的基础概念 定义&#xff1a;使最大子树大小最小的点叫做树的重心 树的重心求解方式 例题&#xff1a; 重心的性质 性质1&#xff1a;重心点的最大子树大小不大于整棵树大小的一半。 性质1证明&#xff1a; 性质1的常用推导 推导1&#xff1a; 推导2&#x…

《Milvus Cloud向量数据库指南》——开源许可证的范围:深入解析与选择指南

在开源软件的广阔天地中,开源许可证作为连接开发者与用户之间的重要法律桥梁,其类型多样且各具特色。每一种许可证都精心设计了特定的权限、限制和要求,旨在保护创作者的权益,同时促进软件的创新与共享。对于开发者和用户而言,深入理解并恰当选择适合的开源许可证,是确保…

C++树(四)二叉树

目录 二叉树的定义&#xff1a; 二叉树相关术语&#xff1a; 二叉树的概念与性质 二叉树基本性质 二叉树的节点数量 满二叉树概念&#xff1a; 完全二叉树概念&#xff1a; 完全二叉树性质&#xff1a; 二叉树的存储 二叉树的遍历 在此基础上&#xff0c;二叉树的遍历…

mac下010editor的配置文件路径

1.打开访达&#xff0c;点击前往&#xff0c;输入~/.config 2.打开这个文件夹 把里面的 010 Editor.ini 文件删除即可&#xff0c;重新安装010 Editor即可

有没有下面符合以下条件的电子时钟的代码

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…

【React1】React概述、基本使用、脚手架、JSX、组件

文章目录 1. React基础1.1 React 概述1.1.1 什么是React1.1.2 React 的特点声明式基于组件学习一次,随处使用1.2 React 的基本使用1.2.1 React的安装1.2.2 React的使用1.2.3 React常用方法说明React.createElement()ReactDOM.render()1.3 React 脚手架的使用1.3.1 React 脚手架…

PostgreSQL使用(四)——数据查询

说明&#xff1a;对于一门SQL语言&#xff0c;数据查询是我们非常常用的&#xff0c;也是SQL语言中非常大的一块。本文介绍PostgreSQL使用中的数据查询&#xff0c;如有一张表&#xff0c;内容如下&#xff1a; 简单查询 --- 1.查询某张表的全部数据 select * from tb_student…

MSPM0G3507基于keil无法烧录的解决方法

在学习M0的板卡过程中&#xff0c;遇到了诸多玄学问题。网上的教学大多基于CCS开发&#xff0c;对keil的教学几乎没有。 一开始我以为这个问题是没添加这个&#xff0c;但其实并非如此 在群里的网友说的清除flash&#xff0c;插拔USB,这些都不管用,后面也发现先在CCS烧录一遍&…

前端开发知识(二)-css

<head> <style> div{ } </style> </head> div是布局标签&#xff0c; 一般放在head标签内&#xff0c;最下部。 若直接在在.css文件中写css,文件中&#xff0c;直接写就行&#xff0c;如下所示。 div{ }

VLLM代码解读 | VLLM Hack 3

在上一期&#xff0c;我们看到了多个输入如何被封装&#xff0c;然后被塞入llm_engine中&#xff0c;接下来&#xff0c;通过_run_engine,我们要进行输入的处理了。 def _run_engine(self, *, use_tqdm: bool) -> List[Union[RequestOutput, EmbeddingRequestOutput]]:# Ini…

java-poi实现excel自定义注解生成数据并导出

因为项目很多地方需要使用导出数据excel的功能&#xff0c;所以开发了一个简易的统一生成导出方法。 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.1</version…

【LeetCode】201. 数字范围按位与

1. 题目 2. 分析 这题挺难想的&#xff0c;我到现在还没想明白&#xff0c;为啥只用左区间和右区间就能找到目标值了&#xff0c;而不用挨个做与操作&#xff1f; 3. 代码 class Solution:def rangeBitwiseAnd(self, left: int, right: int) -> int:left_bin bin(left).…

五. TensorRT API的基本使用-TensorRT-network-structure

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main.cpp2.2 model.cpp 总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第五章—TensorRT API 的基本使用&#x…

java面向对象进阶进阶篇--《接口和接口与抽象类综合案例》(附带全套源代码)

个人主页→VON 收录专栏→java从入门到起飞 抽象类→抽象类和抽象方法 目录 一、初识接口 特点和用途 示例&#xff1a; Animal类 Dog类 Frog类 Rabbit类 Swim接口 text测试类 结果展示&#xff1a; 二、接口的细节 接口中的成员特点&#xff1a; 成员特点与接口的关…

【通信模块】WiFi&Bluetooth简介与对比

学习云里物里科技文章及结合CSDN优秀作者Edison Tao总结笔记&#xff0c;侵权联删&#xff01; 云里物里科技&#xff1a; https://www.minewtech.com/news/industry-2019-01-25-01.html CSDN&#xff1a; https://blog.csdn.net/taotongning/article/details/95215927 WIFI…

EXCEL 排名(RANK,COUNTIFS)

1.单列排序 需求描述&#xff1a;如有下面表格&#xff0c;需要按笔试成绩整体排名。 解决步骤&#xff1a; 我们使用RANK函数即可实现单列整体排名。 Number 选择第一列。 Ref 选择这一整列&#xff08;CtrlShift向下箭头、再按F4&#xff09;。 "确定"即可计算…