Redis源码解析--NET

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介:     关于Redis资料:     要看原滋原味的请点这里,要看有我参与的山寨货请点这里,当然我也不反对看这里。     在接下来的日子里,我会记录下我对Redis源码的一些认识,首先从Event driven programming library开始,没有理由,如果有:那就是redis.h包含的非系统头文件从#include "ae.h"开始,本系列文章以redis-2.6.0-rc3版源码为基准,言归正传吧。

    关于Redis资料:

    要看原滋原味的请点这里,要看有我参与的山寨货请点这里,当然我也不反对看这里

    在接下来的日子里,我会记录下我对Redis源码的一些认识,首先从Event driven programming library开始,没有理由,如果有:那就是redis.h包含的非系统头文件从#include "ae.h"开始,本系列文章以redis-2.6.0-rc3版源码为基准,言归正传吧。

 

一、NET分层

    Redis 网络部分主要分四层:

1 NET分层图

1、  TCP/Unix Socket层(Anet.h117)、Anet.c405))

1socket创建

    anetCreateSocket:创建TCP/Unix socket,设置socket SO_REUSEADDR

2socket属性设置

    anetTcpNoDelay:设置是否关闭Nagle算法,Nagle算法作用点这里

    anetNonBlock:设置阻塞还是非阻塞。

    anetTcpKeepAlive:设置是否开启协议栈心跳,协议栈心跳作用点这里

    anetSetSendBuffer:设置发送buffer大小。

3Connect

    anetTcpGenericConnectTCP Connect原始接口封装,输入IP地址和阻塞/非阻塞参数。

    anetTcpConnectTCP阻塞连接。

    anetTcpNonBlockConnectTCP非阻塞连接。

    anetUnixGenericConnectUnix Connect原始接口封装,输入IP地址和阻塞/非阻塞参数。

    anetUnixConnectUnix阻塞连接。

    anetUnixNonBlockConnectUnix非阻塞连接。

4Listen

    anetListenbindlisten511原因请查Nginx)封装。

    anetTcpServer:调用anetCreateSocketanetListen监听连接到来。

    anetUnixServer:调用anetCreateSocketanetListen监听连接到来。

5Accept

    anetGenericAcceptaccept封装,while直到accept成功或失败才返回。

    anetTcpAccept:调用anetGenericAccept,返回fd,带回IPPort(函数参数)或错误。    

    anetUnixAccept:调用anetGenericAccept,返回fd,或带回错误(函数参数)。

6IPhost互转

    anetPeerToString:由IPAddress->Host

    anetResolve:由Host->IPAddresss

7)格式化error

    anetSetError:变长参数格式化,函数参数带回格式化后error信息。

2、  I/O模型层(Ae_select.c72)、Ae_epoll.c101)、Ae_kqueue.c105))

    三者都有统一的接口,功能大体类似,但也有细节差别,以epoll(参看这里)为蓝本解析如下:

    aeApiState:包含epoll fd句柄和Event指针的structepollkqueue基本一致,而selectrfdswfds集合及副本,具体见Ae_select.c代码第7~12行。

    aeApiCreate:创建aeApiState,并以此初始化aeEventLoop(作用见后文)。epoll_create参数采用Linux kernelhint1024

    aeApiFreeclose epoll fd句柄,释放mallocaeApiStateaeEventLoop

    aeApiAddEvent:通过mask修改或者添加fd对应EventEPOLLINEPOLLOUTepoll_ctl)。

    aeApiDelEvent:通过mask修改或者删除fd对应EventEPOLLINEPOLLOUTepoll_ctl)。

    aeApiPollepoll_wait等待内核返回事件集合,填写fire事件集合用于回调AE_READABLEAE_WRITABLE对应函数。

    aeApiName:取得I/O模型字符串名称("select""epoll""kqueue")。

3、  EventLoop层(Ae.h117)、Ae.c405))

1)回调函数指针

    typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);

    typedef int aeTimeProc(struct aeEventLoop *eventLoop, long long id, void *clientData);

    typedef void aeEventFinalizerProc(struct aeEventLoop *eventLoop, void *clientData);

    typedef void aeBeforeSleepProc(struct aeEventLoop *eventLoop);

2Event Struct

    aeFileEvent:读写事件回调。

    aeTimeEvent:定时器事件回调。

    aeFiredEvent:触发事件回调。

    aeEventLoop:主事件,包含读写事件、定时器事件、触发事件列表。

3Event接口API

    aeCreateEventLoop:创建EventLoop

    aeDeleteEventLoop:删除EventLoop

    aeStop:置EventLoop stop标志。

    aeCreateFileEvent:添加关注事件。

    aeDeleteFileEvent:删除关注事件。

    aeGetFileEvents:获取事件mask

    aeGetTime:获取当前时间。

    aeAddMillisecondsToNow:增加毫秒数当前时间的秒和毫秒上。

    aeCreateTimeEvent:添加定时器事件。

    aeDeleteTimeEvent:删除定时器事件。

    SearchNearestTimer:搜索最近的定时器。

    processTimeEvents:处理定时器事件,回调函数返回AE_NOMORE(-1)则删除定时器,否则更新定时器时间为回调函数返回的时间。

    aeProcessEvents:处理各种事件,用最近定时器即将到来的时间作为epoll_wait的超时间,非常巧妙,如果马上到就立即返回,否则超时间到再返回。

    aeMain:主mainwhile循环直到eventLoop->stop不为0,在调用aeProcessEvents前,先回调aeBeforeSleepProc

    aeGetApiName:获取I/O模型字符串名称("select""epoll""kqueue")。

    aeSetBeforeSleepProc:设置aeBeforeSleepProc回调函数。

4、  Networking层(Networking.c1334))

    暂不表与网络层无直接关系的接口函数。

    createClient:创建redisClient,有连接则设置fdnonblocking,设置TCP_NODELAY,设置AE_READABLE对应的回调函数readQueryFromClient

    prepareClientToWrite:在发送数据给客户端时的预处理,即可以发送数据时设置AE_WRITABLE对应的回调函数sendReplyToClient;是REDIS_LUA_CLIENT时返回REDIS_OK;是fake client或者slave或者setup write handler failed时返回REDIS_ERR

    acceptCommonHandler:调用createClient,校验是否达到最大客户端数。

    acceptTcpHandler:针对TCP依次调用anetTcpAcceptacceptCommonHandler

    acceptUnixHandler:针对Unix,作用同acceptTcpHandler

    freeClient:释放redisClient,删除AE_READABLEAE_WRITABLE,断开master/slave,清除MULTI/EXEC state等。

    sendReplyToClient:发送数据的回调函数,处理write逻辑。

    readQueryFromClient:接收数据的回调函数,处理read逻辑。

    还有一大票addReply…get…,在此略去。

 

二、NET流程

    以redis-cli 从redis-server get数据为例来描述整体流程。

图2 流程图

    

    打完收工,。。。



目录
相关文章
|
10天前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
11天前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
2月前
|
存储 缓存 人工智能
Redis六大常见命令详解:从set/get到过期策略的全方位解析
本文将通过结构化学习路径,帮助读者实现从命令语法掌握到工程化实践落地的能力跃迁,系统性提升 Redis 技术栈的应用水平。
|
4月前
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
288 40
|
3月前
|
存储 缓存 NoSQL
Redis 核心知识与项目实践解析
本文围绕 Redis 展开,涵盖其在项目中的应用(热点数据缓存、存储业务数据、实现分布式锁)、基础数据类型(string 等 5 种)、持久化策略(RDB、AOF 及混合持久化)、过期策略(惰性 + 定期删除)、淘汰策略(8 种分类)。 还介绍了集群方案(主从复制、哨兵、Cluster 分片)及主从同步机制,分片集群数据存储的哈希槽算法。对比了 Redis 与 Memcached 的区别,说明了内存用完的情况及与 MySQL 数据一致性的保证方案。 此外,详解了缓存穿透、击穿、雪崩的概念及解决办法,如何保证 Redis 中是热点数据,Redis 分布式锁的实现及问题解决,以及项目中分布式锁
|
4月前
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
198 6
|
5月前
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
369 17
|
4月前
|
机器学习/深度学习 数据采集 人机交互
springboot+redis互联网医院智能导诊系统源码,基于医疗大模型、知识图谱、人机交互方式实现
智能导诊系统基于医疗大模型、知识图谱与人机交互技术,解决患者“知症不知病”“挂错号”等问题。通过多模态交互(语音、文字、图片等)收集病情信息,结合医学知识图谱和深度推理,实现精准的科室推荐和分级诊疗引导。系统支持基于规则模板和数据模型两种开发原理:前者依赖人工设定症状-科室规则,后者通过机器学习或深度学习分析问诊数据。其特点包括快速病情收集、智能病症关联推理、最佳就医推荐、分级导流以及与院内平台联动,提升患者就诊效率和服务体验。技术架构采用 SpringBoot+Redis+MyBatis Plus+MySQL+RocketMQ,确保高效稳定运行。
278 0
|
7月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
190 4
|
7月前
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章

推荐镜像

更多
  • DNS