Redis源代碼概要


源代碼獲取 git clone https://github.com/antirez/redis.git

讀代碼之前,要先明白Redis是什么?它的整體結構是什么?這樣讀代碼才不至於盲目。在對軟件不太了解的前提下,想通過讀源代碼來熟悉它是件很困難的事。

但反過來,已知軟件的功能,回過頭來找找它是怎么實現的,待着問題來閱讀代碼可以收獲更多。

  1. key value store.是⼀一個以key-value形式存儲的數據庫,定位直指MySQL,⽤用來作為唯⼀一的存儲系統。
  2. memory cache.是⼀一個把數據存儲在內存中的⾼高速緩存,⽤用來在應⽤用和數據庫間提供緩沖,替代memcachd。
  3. data structrue server.把它⽀支持對復雜數據結構的⾼高速操作作為賣點,提供某些特殊業務場景的計算和展現需求。⽐比如排⾏行行榜應⽤用,Top 10之類的。

  redis的代碼歸類很清晰:代碼有層次感。源碼按功能分類,每個文件只干屬於⾃己的事:

 

 Redis的整體架構圖如下:

 

 

1,作為K-V Store, redis以一個哈希表保存着所有的對象。
2,作為⼀個memcached, 它的內存高速緩存與⽹絡通訊接⼝值得分析。
3,作為⼀一個data structrue server, 它提供了多種數據結構

 

 

 

 

和剛才看到的⼀一樣,”set hello world”命令往db->dict⾥插⼊k-v結構。
• 但是key和value都不是簡單的字符串。
• redis支持五種數據類型(string, list, set, sorted set, hash)
• 為了代碼簡潔,redis將它們抽象為robj.

 

Redis是⾯向對象的:
• 它⽤了⼀一個redisObject的抽象類型來屏蔽具體的不同類型的數據結構。
redis有良好的設計:
• ⽤用createObject來創建具體的對象。
• ⽤用⼀一組具體函數createStringObject,createSetObject…來強化對象的創建,避免業務代碼直接調⽤用createObject。
• 對object的操作,提供⼀一組專有函數。代碼的結構要有合理理的抽象
• 從dict的Value, 到redisObject,到具體的t_string,再到底層數據結構sds。可以由遠到近來查看redis的源碼。⽽不是⼀下⼦就直接到了了char*, list等數據結構。

 

 

 

⽹絡采用了reactor模型
• 對⽹網絡代碼有合理理的封裝,將⽹絡處理代碼與業務處理代碼進行了分離。
• 可以看到在setCommand函數⾥,不會交雜着對IO的讀取,⽹絡數據的緩沖等底層操作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM