1. 程式人生 > >Redis網路庫原始碼分析(1)之介紹篇

Redis網路庫原始碼分析(1)之介紹篇

一、前言

Redis網路庫是一個單執行緒EPOLL模型的網路庫,和Memcached使用的libevent相比,它沒有那麼龐大,程式碼一共2000多行,因此比較容易分析。其實網上已經有非常多有關這個網路庫的分析了,但是我覺得它們的不足在於只是分析了各個檔案中各個函式的單獨含義,而沒有將其統一起來,不能給讀者一種巨集觀的把握。比如我如果想把這個網路庫直接拿出來為我所用該怎麼辦,但是 @淺墨 學長已經完成了這個事,他拿出了Redis網路部分的程式碼,設計了應用層協議,添加了應用層buffer,定義了伺服器型別。讓它現在變成了一個可以實現簡單聊天的小程式。 大家可以 fork這個專案,在這個單執行緒的網路模型上做更多有意思的事情。

因此我的分析基於這個簡單的聊天程式,我們從建立伺服器開始,到它開始工作,把整個過程疏理一遍其實網路庫主幹就已經出來了,而且這種方式更加容易讓人明白各個函式的真正含義,話不多說,擼起袖子開幹。

二、環境準備

1:fork&clone

$ git clone https://github.com/hurley25/ANet.git

2: 測試一波

$ cd ANet/
$ cmake .
$ make
$ ./server
$ ./server_test   //在另一個終端

這裡寫圖片描述

備註:客戶端測試分為三次傳送(每次20個數據包),第一次正常傳送,第二次usleep(10000),第三次分為單個位元組傳送,伺服器端結果顯示均正常到達。TCP是一個流協議,保證按位元組到達,應用層的粘包需要我們自己處理,這裡是通過測試的。

三、模型介紹

Redis網路庫是一個單執行緒EPOLL模型,也就是說接收連線處理讀寫請求包括定時器任務都被這一個執行緒包攬,真的是又當爹又當媽,但是效率一定比多執行緒差嗎?不見得。

單執行緒的好處有:
1:避免執行緒切換帶來的上下文切換開銷。
2:單執行緒避免了鎖的爭用。
3:對於一個記憶體型資料庫,如果不考慮資料持久化,也就是讀寫物理磁碟,不會有阻塞操作,記憶體操作是非常快的。

它的處理流程如圖所示:

這裡寫圖片描述

四、各個檔案含義介紹

這裡寫圖片描述

各個檔案的含義如下所示(前兩行是Redis原始碼):

檔案 作用
ae.c ae.h ae_epoll.c ae_select.c Redis事件處理器的實現,Linux平臺上是epoll(Redis原始碼)
anet.c anet.h Redis網路庫的實現(Redis原始碼)
buffer.c buffer.h 自行實現的buffer
protocol.c protocol.h 自行定義協議
define.h 一些常量,比如listen的backlog大小
server.c server.h server_test.c 自定義的服務端和客戶端程式

相關推薦

Redis網路原始碼分析(1)介紹

一、前言 Redis網路庫是一個單執行緒EPOLL模型的網路庫,和Memcached使用的libevent相比,它沒有那麼龐大,程式碼一共2000多行,因此比較容易分析。其實網上已經有非常多有關這個網

Redis網路原始碼分析(3)ae.c

一、aeCreateEventLoop & aeCreateFileEvent 上一篇文章中,我們已經將伺服器啟動,只是其中有些細節我們跳過了,比如aeCreateEventLoop函式到底做了什麼? 接下來我們要分析ae.c檔案,它是整個Redis

Muduo 網路原始碼分析 關鍵技術點總結

最近又把muduo網路庫仔細研究了一遍,收穫良多。本文將對muduo中的設計思想以及關鍵的技術細節進行總結和分析,當然由於篇幅的原因這裡更多的是對關鍵技術的簡略提及,具體細節還需要讀者自己去查詢學習資料。 muduo/base Date類 日期類的封裝,

Muduo網路原始碼分析(四)EventLoopThread和EventLoopThreadPool的封裝

muduo的併發模型為one loop per thread+ threadpool。為了方便使用,muduo封裝了EventLoop和Thread為EventLoopThread,為了方便使用執行緒

Muduo網路原始碼分析(二) 定時器TimeQueue,Timer,TimerId

首先,我們先要明白為什麼需要設計這樣一個定時器類? 在開發Linux網路程式時,通常需要維護多個定時器,如維護客戶端心跳時間、檢查多個數據包的超時重傳等。如果採用linux的SIGALARM訊號實現,則會帶來較大的系統開銷,且不便於管理。 Muduo 的 Timer

【 專欄 】- muduo網路原始碼分析

muduo網路庫原始碼分析 muduo是基於Reactor模式的C++網路庫,採用Reactor + 執行緒池的方法提高併發性。內部對於事件驅動,執行緒池,定時器,io複用的設計都非常值得學習。設計技巧對C++程式碼風格有很大的幫

Muduo網路原始碼分析(一) EventLoop事件迴圈(Poller和Channel)

從這一篇博文起,我們開始剖析Muduo網路庫的原始碼,主要結合《Linux多執行緒服務端程式設計》和網上的一些學習資料! (一)TCP網路程式設計的本質:三個半事件 1. 連線的建立,包括服務端接受(accept) 新連線和客戶端成功發起(connect) 連線。TCP 連

Muduo網路原始碼分析(三)執行緒間使用eventfd通訊和EventLoop::runInLoop系列函式

先說第一點,執行緒(程序)間通訊有很多種方式(pipe,socketpair),為什麼這裡選擇eventfd? eventfd 是一個比 pipe 更高效的執行緒間事件通知機制,一方面它比 pipe

libevent高效能網路原始碼分析——事件(event)及其介面(三)

libevent的結構 event結構 // include/event2/event_struct.h struct event { TAILQ_ENTRY(event) ev_active_next; // 已就緒的事件連結串列

1、Spring原始碼分析1讀取配置檔案

1、XMLBeanFcatory BeanFactory bf = new XmlBeanFactory(new ClassPa

FFmpeg libswscale原始碼分析1-API介紹

本文為作者原創,轉載請註明出處: libswscale 是 FFmpeg 中完成影象尺寸縮放和畫素格式轉換的庫。使用者可以編寫程式,呼叫 libswscale 提供的 API 來進行影象尺寸縮放和畫素格式轉換。也可以使用 scale 濾鏡完成這些功能,scale 濾鏡實現中呼叫了 libswscale

springBoot整合Redis遇到的坑(擇)原始碼分析為什麼擇失敗

1.配置實現SpringBoot整合Redis(只需兩步) 1.最簡單的配置就是在application.propertity中配置 #cache指定快取型別 spring.cache.type=REDIS #data-redis spring.redis.database=15 spring.r

redis原始碼分析1------dict的實現

1. 總體結構 redis的dict就是hash表,使用鏈式結構來解決key值衝突,典型的資料結構 結構體的定義如下: typedef struct dictEntry { void *key; union { void *val; uint64_t

React Native 4 for Android原始碼分析 一《JNI智慧指標介紹

導讀 React Native 釋出以來將近一年多了,也被抄的火爆到不行,包括RN的中文網和各種資料也很多,加之SE5,Se6語法升級,學習成本並不在RN環境搭建和入門,關鍵還是對JS的掌握入門,不管你是用Native開發,h5開發,還是React

布隆過濾器:Google Guava類原始碼分析及基於Redis Bitmaps的重構

本文源地址:http://www.fullstackyang.com/archives/464.html,轉發請註明該地址或伯樂線上地址,謝謝! 一、背景知識 在網上已經有很多關於布隆過濾器的介紹了,這裡就不再贅述,下面簡單地提煉幾個要點: 布隆過濾器是用來判斷一

tcpdump原始碼分析(1)——介紹

本系列會分析網路診斷工具tcpdump。使得大家(其實主要是針對自己本人)對tcpdump抓包原理和機制有深入認識,並掌握如何對其進行功能擴充套件。同時能起到細化linux網路協議棧知識點的功效。            第一篇從整體上來進行介紹,以及原始碼出處。       

Monkey原始碼分析1—Monkey簡單介紹

Monkey官網介紹,點選檢視 1.Monkey功能介紹 Monkey是Android平臺自動化測試的一種手段,通過Monkey程式模擬使用者觸控式螢幕幕、滑動Trackball、按鍵等操作來對裝

muduo原始碼分析1--整體架構

最近,學習了陳碩大俠的《Linux多執行緒服務端程式設計:使用muduo C++網路庫》很受啟發。但是在學習muduo原始碼的過程中,還是感覺程式碼架構比較複雜,一個是和boost相關的內容比較多,對現代C++程式設計理念不瞭解的人,可能感覺莫名其妙。(關於什麼

redis cluster叢集的原始碼分析(1)

對於cluster.c的原始碼分析,我將會分兩部分介紹。本文主要分析叢集通訊和通訊故障。 先大致歸納下cluster的主要函式 void clusterCron(void);//叢集的定時任務 int clusterProcessPacket(clusterLink *l

[原始碼分析] OpenTracing跟蹤Redis

# [原始碼分析] OpenTracing之跟蹤Redis [toc] ## 0x00 摘要 本文將通過研究OpenTracing的Redis埋點外掛來進一步深入理解OpenTracing。 ## 0x01 總體邏輯 ### 1.1 相關概念 Tracer是用來管理Span的統籌者,負責建立spa