六星云課堂:這5個開源項目,C語言開發(fā)工程師一定要學(xué)會!
如果大家詳細(xì)的分析一下自己所從事過的項目,或者分析一下目前熱門招聘崗位,就可以抽取一些公共的技術(shù)(或者基礎(chǔ)技術(shù)),如果能熟練掌握這些基礎(chǔ)技術(shù),對開發(fā)工作將達到事半功倍的效果,同時對以后跳槽也有很大的幫助。如果本文直接說出這些技術(shù)概念,大家肯定非常清楚,但達到熟悉的程度確實難上加難。因此,本文搜集了目前比較流行的幾個開源項目,這些項目中基本上包含了這些技術(shù),如果大家能把這些開源項目學(xué)透,在以后的開發(fā)工作中將如魚得水。
Redis
Redis的全稱是REmote DIctionary Server,由Salvatore Sanfilippo寫的key-value存儲系統(tǒng),更多的場景是作為數(shù)據(jù)庫的前端緩存。Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,其最大的特點是可以基于網(wǎng)絡(luò)進行訪問。雖然稱為KV數(shù)據(jù)庫,但Redis支持的值類型非常豐富,可以是字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類類型。
廢話說了這么多,那么我們可以從這個開源項目學(xué)到什么內(nèi)容呢?具體來說主要可以學(xué)習(xí)如下內(nèi)容:
算法和數(shù)據(jù)結(jié)構(gòu): 由于其支持如此之多的數(shù)據(jù)類型,除了常規(guī)的鏈表等數(shù)據(jù)結(jié)構(gòu)外,還有調(diào)表、散列和集合等實現(xiàn)。由于其對性能的要求,因此在其實現(xiàn)的時候?qū)?shù)據(jù)結(jié)構(gòu)和算法的應(yīng)用達到了吹毛求疵的地步。網(wǎng)絡(luò)編程:Redis實現(xiàn)了跨平臺的支持,為了支持不同平臺的網(wǎng)絡(luò)編程,特別是異步編程模型。Nginx
Nginx是一款輕量級的Web 服務(wù)器/反向代理服務(wù)器及電子郵件(IMAP/POP3)代理服務(wù)器,并在一個BSD-like 協(xié)議下發(fā)行。詳細(xì)進行Web開發(fā)和運維的同學(xué)沒有不知道Nginx的,它既可以做Web服務(wù)器,又可以做反向代理實現(xiàn)負(fù)載均衡。
Nginx的代碼非常值得閱讀,通過閱讀其代碼可以熟悉如下內(nèi)容:
網(wǎng)絡(luò)編程: 可以熟悉網(wǎng)絡(luò)編程及服務(wù)端異步框架模型。例如select、poll、epoll和kqueue等的使用方式。HTTP協(xié)議:屬性HTTP協(xié)議的實現(xiàn)細(xì)節(jié)。插件架構(gòu): Nginx的擴展功能通過插件實現(xiàn),閱讀其代碼可以了解插件的實現(xiàn)原理,插件機制在軟件開發(fā)中應(yīng)用廣泛。Leveldb或RocksDB
Leveldb是一個google實現(xiàn)的非常高效的kv數(shù)據(jù)庫,RocksDB功能與其相同,但其內(nèi)部做了很多完善和改進。兩者都是在互聯(lián)網(wǎng)領(lǐng)域應(yīng)用廣發(fā)的開源項目。

學(xué)習(xí)其源代碼可以對如下領(lǐng)域有更加深入的理解:
網(wǎng)絡(luò)編程: 不過多介紹了磁盤數(shù)據(jù)存儲: 兩者的目的都是實現(xiàn)一種高效的KV存儲,因此對磁盤的訪問及數(shù)據(jù)組織都費了很多心思,以保證其性能的最大化。數(shù)據(jù)結(jié)構(gòu): 前面幾個開源想更多的是在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),但對于磁盤數(shù)據(jù)的存儲卻沒有任何優(yōu)勢。LevelDB和RocksDB中對磁盤數(shù)據(jù)存儲和讀取有其獨特的數(shù)據(jù)結(jié)構(gòu)。閱讀其代碼可以讓我們在數(shù)據(jù)結(jié)構(gòu)的另外一個領(lǐng)域大開眼界。SQLite
SQLite 是一個軟件庫,實現(xiàn)了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的 SQL 數(shù)據(jù)庫引擎。SQLite 是在世界上最廣泛部署的 SQL 數(shù)據(jù)庫引擎。SQlite的代碼量才1萬行左右,去掉注釋后5千多行,代碼量不大,注釋豐富,非常適合學(xué)習(xí)。
閱讀其代碼可以對關(guān)系型數(shù)據(jù)庫的實現(xiàn)細(xì)節(jié)有深入的了解。特別是數(shù)據(jù)的組織、磁盤訪問和數(shù)據(jù)一致性的保證等。
Tinyhttpd
Nginx的代碼量是比較大的,幾萬行的代碼閱讀起來可能比較吃力。如果想了解HTTP協(xié)議的具體實現(xiàn),由不太敢閱讀Nginx的代碼怎么辦?正好有個替代方案,那就是tinyhttpd,它是一個超輕量型Http Server,使用C語言開發(fā),全部代碼只有502行(包括注釋),附帶一個簡單的Client,可以通過閱讀這段代碼理解一個 Http Server 的本質(zhì)。
好了,先介紹到這,相信還有很多值得學(xué)習(xí)的開源項目,這里就不一一介紹了。想學(xué)習(xí)更多C語言技巧,歡迎持續(xù)關(guān)注六星云課堂!