搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
菜鸟追梦旅行
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
最详细的【微信小程序+阿里云Web服务】开发部署指引(四):搭建服务端数据库_微信小程序链接阿里云数据库
2
Axure8.0基础教程 一_axure 时间轴
3
AI大模型基础环境搭建_怎么样搭建ai模型
4
EDB日志配置-慢sql记录分析
5
R绘图笔记 | 火山图的绘制
6
Threejs进阶之十三:CSS3DRenderer与Tween.js实现粒子小球按规律变化_threejs 根据logo图生成粒子效果
7
hydra安装与使用
8
数据库复习题选择题+判断题+填空题(考试续命必备_数据库建模与设计选择题
9
Python——import、time、os、random模块_"import os import time import random output_direct
10
SpringCloud源码之Spring Cloud Common核心接口说明_registration继承serviceinstance 啥都没做 为啥要多此一举
当前位置:
article
> 正文
redis网络层学习_redis获取网络层数据
作者:菜鸟追梦旅行 | 2024-02-28 03:12:15
赞
踩
redis获取网络层数据
今天晚上把redis网络层的几个文件单独拉出来,写了一个小的test,检验了下自己对于redis网络层的理解,简单的写了一个echo程序。server接受客户端的连接请求,收到客户端的消息后,直接返回给客户端,就相当于echo的回行显示。
下面就redis的网络层进行说明
1.redis主要网络层主要是一下几个文件,ae.c 、ae_epoll.c、anet.c 这3个文件。
ae.c该文件中的头文件声明了非常重要的一个结构体如下:
/* State of an event based program */
typedef struct aeEventLoop {
int maxfd;
long long timeEventNextId;
aeFileEvent events[AE_SETSIZE]; /* Registered events */
aeFiredEvent fired[AE_SETSIZE]; /* Fired events */
aeTimeEvent *timeEventHead;
int stop;
void *apidata; /* This is used for polling API specific data */
aeBeforeSleepProc *beforesleep;
} aeEventLoop;
redis的网络层就是通过该结构体保存socket的套接字,设定每个fd不同事件的回调函数,超时事件等。。。
ae.c文件中有几个重要的函数如下:
aeEventLoop *aeCreateEventLoop(void); 创建一个aeEvenetLoop结构体,返回指向该结构体的指针
int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, aeFileProc *proc, void *clientData);
创建fileEvent事件,将套接字fd的事件mask的回调函数设置为proc,并将fd放入eventLoop中。clientdata用于指定回调函数的参数。该函数有个问题是,如果需要给fd指定两个不同事件的不同回调函数,需要调用该函数两次。
void aeDeleteFileEvent(aeEventLoop *eventLoop, int fd, int mask);
该函数将fd的时间mask从事件表中删除,已达到解除注册epoll事件的效果。
int aeProcessEvents(aeEventLoop *eventLoop, int flags)
该函数用于执行一次事件到来,有flags指定要处理的事件类型。
ae_epoll.c该文件就是对于epoll的封装。其中有些重要的函数如下
static int aeApiCreate(aeEventLoop *eventLoop)
创建epoll句柄和aeApiState 结构体,并将该结构体赋值玉aeEventLoop 的指针apidata。 这样可以通过
aeEventLoop 处理事件循环了。
static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask)
将套接字fd的mask事件注册到epoll中
static void aeApiDelEvent(aeEventLoop *eventLoop, int fd, int delmask)
将套接字fd的事件delmask从epoll中删除
static int aeApiPoll(aeEventLoop *eventLoop, struct timeval *tvp)
该函数就是执行一次epoll_wait并将触发事件的fd置于eventLoop中的fired中,然后在外层处理事件。
从而与事件处理剥离出来,通过一个eventLoop来联系。
anet.c 封装了一些socket的方法,用到的如下:
static int anetCreateSocket(char *err, int domain)
创建一个socket句柄fd
int anetTcpServer(char *err, int port, char *bindaddr)
在指定的ip和端口上创建socket句柄fd并绑定监听
int anetTcpAccept(char *err, int s, char *ip, int *port)
处理tcp链接请求。s为监听套接字,ip port为链接上来客户端的ip port。
该文件还实现了socket异步,设置缓冲区大小等函数。将socket的基本功能很好的实现,只需要调用相应的函数就行。
也可以自己进行二次封装。
总结:redis的网络有着良好的封装,但是使用起来也不是那么方便,每次需要调用很多的函数完成socket的创建绑定端口监听,处理链接请求等。不过由于redis是用c写的,比较简洁。
有能力可以将网络层改写成c++的类,这样可以实现一个自己的网络库,处理一些基本的网络事件。
下面附上自己实现的echo例子。当然要通过编译,需要改一点redis的网络层中的代码,主要都是和内存分配有关的,没有使用redis提供的内存分配策略,而是使用了系统内存分配malloc函数来实现。
代码如下
http://download.csdn.net/detail/kingqizhou/5112440
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/157386
推荐阅读
article
引入
springcloud
报错
。
common
依赖
找不到_
springcloud
与
redis
集成...
在SpringCloud中集成
redis
,我们通常
引入
依赖
spring-boot-starter-data-
redis
,...
赞
踩
article
How
Twitter
Uses
Redis
To
Scale
-
10
5TB
RAM, 39MM ...
Yao Yu has worked on
Twitter
’s Cache team since 20
10
. She re...
赞
踩
article
NoSQL
数据
库
管理工具,搭载强大支持:
Redis
、
Memcached
、
SSDB
、
LevelDB
、...
从单一应用程序中同时连接
Redis
、
Memcached
、
SSDB
、
LevelDB
、
RocksDB
,你可以快速轻松地创建...
赞
踩
article
笔记分享-
Redis
原理(
Redis
底层
数据结构
+
Redis
网络
模型
+
Redis
内存
回收)_简述 r...
Redis
原理笔记分享_简述
redis
的线程
模型
以及
底层
架构设计
简述
redis
的线程
模型
以及
底层
架构设计
...
赞
踩
article
Termux 使用_
termux
redis
...
1 初始化配置1.1 更换镜像源sed -i 's@^\(deb.*stable main\)$@#\1\ndeb ht...
赞
踩
article
Redis
工具类 与
Redis
布隆
过滤器
...
Redis
基础操作工具 、
Redis
序列化、
Redis
布隆
过滤器
3.
布隆
过滤器
4.
Redis
工具类5. 查询R...
赞
踩
article
fastadmin
引用
redis
方法2...
页面上引用 use \think\cache\driver\Redis;
fastadmin
引用
redis
方法2 ...
赞
踩
article
云
数据库
Redis
性能
深度评测(
阿里
云
、
华为
云
、
腾讯
云
、百度智能
云
)...
阿里
云
:整体
性能
排名第一,其中模型1中9/16个场景,模型3小Key读相关场景
性能
表现明显优于其它所有竞品百度智能
云
:全...
赞
踩
article
spring
boot
架构图_基于
spring
boot
+
redis
+ elasticsear...
spring
boot
容器启动流程:其中最重要的:运行机制为:
spring
boot
事件驱动:详情见:
spring
boot
事...
赞
踩
article
7.18 web层面安全
sql
,xss,加密,
express
对比原生
http
,
express
-ses...
1、
sql
注入解决方案:node端使用 my
sql
.escape()过滤即可// 未过滤写法(单引号包裹)// user...
赞
踩
article
为什么
redis
单线程
却能支撑高并发?_
多路复用
机制
单线程
反而
避免
了
多线程
的频繁
上下文
切换
问题
...
纯内存操作核心是基于非阻塞的 IO
多路复用
机制
单线程
反而
避免
了
多线程
的频繁
上下文
切换
问题
1)不需要各种锁的性能消耗Re...
赞
踩
article
SpringBoot整合
Redis
_
springboot
redis
...
Bean// 默认的
Redis
Template 没有过多的设置,
redis
对象都是需要序列化!// 两个泛型都是 O...
赞
踩
article
Redis
-
SpringBoot
整合_
redistemplate
.
getconnection
fact...
说明: 在
SpringBoot
2.x 之后,原来使用的jedis 被替换为了 lettucejedis : 采用的直连...
赞
踩
article
springboot 整合
redis
(
Redis
Connection
Redis
Connecti...
目录1.起步2.钻进去康一康2.1.
Redis
Connection
2.2.
Redis
Connection
Factory2...
赞
踩
article
Spring
Boot
整合
Redis
_springboot
redis
...
Redis
是一个开源(BSD许可)的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,并提供多种语言的AP...
赞
踩
article
Spring
Boot
的
Spring
Data
Redis
和
Redis
Template(String...
Spring
Boot
提供了 spring-boot-starter-data-
redis
使用
Spring
Data
...
赞
踩
article
springboot
使用
redis
_
springboot
redis
...
默认有三种方式连接
redis
.第一种:jedis—传统的项目–ssm第二种:lettuce:---->刚出现没有多久就被...
赞
踩
article
springboot
与
redis
_
springboot
redis
...
springboot
对
redis
的操作封装了两个StringRedisTemplate和RedisTemplate类,S...
赞
踩
article
【
Redis
】基本
操作
-
命令行
操作
...
通过这些简单而强大的命令,我们可以在
命令行
中轻松地进行基本的
Redis
操作
。在学习阶段一的基本
操作
后,你应该对如何使用R...
赞
踩
article
springboot
整合
redis
_
springboot
redis
...
创建
springboot
整合
redis
工程: 首先我们要知道什么是
redis
: 三个步骤:补充:RedisTemplat...
赞
踩
相关标签
引入springcloud报错。common依赖找不到
redis
twitter
cache
数据库
nosql
数据结构
网络
mysql
linux
mariadb
termux
jdk
缓存
bootstrap
云原生数据库
数据库开发
java
后端
spring boot