Redis源代碼概要

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

讀代碼以前,要先明白Redis是什麼?它的總體結構是什麼?這樣讀代碼纔不至於盲目。在對軟件不太瞭解的前提下,想經過讀源代碼來熟悉它是件很困難的事。git

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

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

  redis的代碼歸類很清晰:代碼有層次感。源碼按功能分類,每一個文件只幹屬於⾃己的事: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的讀取,⽹絡數據的緩衝等底層操做。架構

相關文章
相關標籤/搜索