redis源碼解析
❶ redis源碼中的後綴是.o文件是什麼文件
.o 就是object, 也就相當於windows下編譯的obj文件, 俗稱目標文件
是指源代碼經過編譯程序產生的能被cpu直接識別二進制代碼。由編譯器生成,
具體的生成方法在不同的開發環境上是不同的.
網路說.o文件是對象文件
裡麵包含的內容就是01這樣的機器可執行的執令
當你程序要執行時還需要進行鏈接(link).
連接程序再將這個文件與系統庫文件連接就生成可執行文件
就是把多個.o文件鏈成一個可執行文件
❷ 如圖是redis源碼的一部分,為什麼可以typedef一個struct內部的struct但是自己嘗試的時候編譯不通過
Redis是用C語言寫的,而你的代碼是C++的,C++編譯器相對而言檢查更嚴格。如果你用C編譯器編譯就會發現這句能編譯通過
Redis的代碼其實寫的不規范,因為忽略作用域本身就是不對的
❸ mac redis desktop manager 源碼怎麼使用
redis是一個資料庫 redis是一個內存資料庫, 所有數據基本上都存在於內存當中, 會定時以追加或者快照的方式刷新到硬碟中.
由於redis是一個內存資料庫, 所以讀取寫入的速度是非常快的, 所以經常被用來做數據, 頁面等的緩存!
❹ Redis底層數據結構解密
一:摘要概述
很多 redis 的使用者都可以清晰明白的道出Redis中常用的對象如string、list、hash、set、zset,一些場景比較豐富的使用者可能會說布隆過濾器、geo、Hash等。但是對於這些對象底層實現的數據結構卻是知之甚少,將會詳細闡述redis中的底層數據結構。為了彌補大家的創傷,今天分享Redis底層數據結構內容。
二:SDS
string作為redis中常用對象之一,普遍用於用戶信息緩存等場景。當string對象中encoding編碼為embstr或raw時都是採用sds作為其底層實現
2.1 SDS結構
源碼文件位於redis安裝目錄src下的sds.h,sds聲明了五種頭部類型,分別為sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64。根據字元串長度創建不同頭部的sds實例
struct __attribute__ ((__packed__)) sdshdr8 {
uint8_t len;
uint8_t alloc;
unsigned char flags;
char buf[];
};
屬性名稱作用含義
len字元串長度
alloc預分配空間大小
flags低三位用於表示sds類型,可以查看sds.h文件76-82行定義
buf[]存儲字元串用數組
2.2 SDS與C字元串區別
區別描述
長度計算 c中的字元串長度計算需要數組遍歷,但是redis中的sds自身維護了len屬性。所以O(1)時間復雜度即可
緩沖區溢出c中字元串更改如果未提前做好內存分配則會內存溢出,但是sds則會根據alloc與len計算預留內存是否足夠分配重新申請內存
動態擴展 緩沖區溢出已經闡述這個概念,sds的內存空間會在字元串內容變更時自動擴展計算。策略為當字元換小於1M時*2翻倍,大於1M時每次擴容1M
惰性釋放 與空間預分配相似操作的還有內存惰性釋放,即字元串刪除某些內容後所佔用的內存空間並不會立即釋放,後續字元串變更擴展就無需再申請內存
二:ZipList
ziplist可以說把redis對於內存的極致操作體現的淋漓盡致,鏈表除了節點值之外還需要維護前後節點兩個指針,並且還會造成內存碎片。壓縮列表緊湊的內存布局,所有節點都維護在整塊內存中處理
2.1 ZipList結構
屬性名稱作用含義
zlbytes列表健佔用內存的總位元組數,在對列表健內存重分配或者是計算zlend的時候使用
zltail 指向壓縮列表起始地址的指針
zllen 壓縮列表的節點數量
entry壓縮列表保存的節點數據
zlend壓縮列表的尾節點
2.2 Entry節點結構
屬性名稱作用含義
previous_entry_length 位元組為單位記錄上一個節點的長度,如果上一個位元組長度小於254佔用1位元組。大於254佔用5位元組,第一個位元組設置為OxFE(十進制254),後面四個位元組儲存長度
encoding 記錄content記錄的數據類型以及長度。長度一、二、五位元組,值的最高位為00、01、10表示類型為位元組數組,長度使用除去最高位的其它位記錄。11開頭表示儲存整數,除去最高位其他位置表示content數據長度
content 記錄壓縮列表記錄的數據
❺ 如何高效深入的閱讀Redis的源碼
在這篇文章中, 我將向大家介紹一種我認為比較合理的 Redis 源碼閱讀順序, 希望可以給對 Redis 有興趣並打算閱讀 Redis 源碼的朋友帶來一點幫助。
第 1 步:閱讀數據結構實現
剛開始閱讀 Redis 源碼的時候, 最好從數據結構的相關文件開始讀起, 因為這些文件和 Redis 中的其他部分耦合最少, 並且這些文件所實現的數據結構在大部分演算法書上都可以了解到, 所以從這些文件開始讀是最輕松的、難度也是最低的。
下表列出了 Redis 源碼中, 各個數據結構的實現文件:
文件 內容
sds.h 和 sds.c Redis 的動態字元串實現。
adlist.h 和 adlist.c Redis 的雙端鏈表實現。
dict.h 和 dict.c Redis 的字典實現。
redis.h 中的 zskiplist 結構和 zskiplistNode 結構, 以及 t_zset.c 中所有以 zsl 開頭的函數, 比如 zslCreate 、 zslInsert 、 zslDeleteNode ,等等。 Redis 的跳躍表實現。
hyperloglog.c 中的 hllhdr 結構, 以及所有以 hll 開頭的函數。 Redis 的 HyperLogLog 實現。
第 2 步:閱讀內存編碼數據結構實現
在閱讀完和數據結構有關的文件之後, 接下來就應該閱讀內存編碼(encoding)數據結構了。
和普通的數據結構一樣, 內存編碼數據結構基本上是獨立的, 不和其他模塊耦合, 但是區別在於:
上一步要讀的數據結構, 比如雙端鏈表、字典、HyperLogLog, 在演算法書上或者相關的論文上都可以找到資料介紹。
而內存編碼數據結構卻不容易找到相關的資料, 因為這些數據結構都是 Redis 為了節約內存而專門開發出來的, 換句話說, 這些數據結構都是特製(adhoc)的, 除了 Redis 源碼中的文檔之外, 基本上找不到其他資料來了解這些特製的數據結構。
不過話又說回來, 雖然內存編碼數據結構是 Redis 特製的, 但它們基本都和內存分配、指針操作、位操作這些底層的東西有關, 讀者只要認真閱讀源碼中的文檔, 並在有需要時, 畫圖來分析這些數據結構, 那麼要完全理解這些內存編碼數據結構的運作原理並不難, 當然這需要花一些功夫。
下表展示了 Redis 源碼中, 各個內存編碼數據結構的實現文件:
文件 內容
intset.h 和 intset.c 整數集合(intset)數據結構。
ziplist.h 和 ziplist.c 壓縮列表(zip list)數據結構。
第 3 步:閱讀數據類型實現
在完成以上兩個閱讀步驟之後, 我們就讀完了 Redis 六種不同類型的鍵(字元串、散列、列表、集合、有序集合、HyperLogLog)的所有底層實現結構了。
接下來, 為了知道 Redis 是如何通過以上提到的數據結構來實現不同類型的鍵, 我們需要閱讀實現各個數據類型的文件, 以及 Redis 的對象系統文件, 這些文件包括:
文件 內容
object.c Redis 的對象(類型)系統實現。
t_string.c 字元串鍵的實現。
t_list.c 列表鍵的實現。
t_hash.c 散列鍵的實現。
t_set.c 集合鍵的實現。
t_zset.c 中除 zsl 開頭的函數之外的所有函數。 有序集合鍵的實現。
hyperloglog.c 中所有以 pf 開頭的函數。 HyperLogLog 鍵的實現。
第 4 步:閱讀資料庫實現相關代碼
在讀完了 Redis 使用所有底層數據結構, 以及 Redis 是如何使用這些數據結構來實現不同類型的鍵之後, 我們就可以開始閱讀 Redis 裡面和資料庫有關的代碼了, 它們分別是:
文件 內容
redis.h 文件中的 redisDb 結構, 以及 db.c 文件。 Redis 的資料庫實現。
notify.c Redis 的資料庫通知功能實現代碼。
rdb.h 和 rdb.c Redis 的 RDB 持久化實現代碼。
aof.c Redis 的 AOF 持久化實現代碼。
選讀
Redis 有一些獨立的功能模塊, 這些模塊可以在完成第 4 步之後閱讀, 它們包括:
文件 內容
redis.h 文件的 pubsubPattern 結構,以及 pubsub.c 文件。 發布與訂閱功能的實現。
redis.h 文件的 multiState 結構以及 multiCmd 結構, multi.c 文件。 事務功能的實現。
sort.c SORT 命令的實現。
bitops.c GETBIT 、 SETBIT 等二進制位操作命令的實現。
第 5 步:閱讀客戶端和伺服器的相關代碼
在閱讀完資料庫實現代碼, 以及 RDB 和 AOF 兩種持久化的代碼之後, 我們可以開始閱讀客戶端和 Redis 伺服器本身的實現代碼, 和這些代碼有關的文件是:
文件 內容
ae.c ,以及任意一個 ae_*.c 文件(取決於你所使用的多路復用庫)。 Redis 的事件處理器實現(基於 Reactor 模式)。
networking.c Redis 的網路連接庫,負責發送命令回復和接受命令請求, 同時也負責創建/銷毀客戶端, 以及通信協議分析等工作。
redis.h 和 redis.c 中和單機 Redis 伺服器有關的部分。 單機 Redis 伺服器的實現。
如果讀者能完成以上 5 個閱讀步驟的話, 那麼恭喜你, 你已經了解了單機的 Redis 伺服器是怎樣處理命令請求和返回命令回復, 以及是 Redis 怎樣操作資料庫的了, 這是 Redis 最重要的部分, 也是之後繼續閱讀多機功能的基礎。
選讀
Redis 有一些獨立的功能模塊, 這些模塊可以在完成第 5 步之後閱讀, 它們包括:
文件 內容
scripting.c Lua 腳本功能的實現。
slowlog.c 慢查詢功能的實現。
monitor.c 監視器功能的實現。
第 6 步:閱讀多機功能的實現
在弄懂了 Redis 的單機伺服器是怎樣運作的之後, 就可以開始閱讀 Redis 多機功能的實現代碼了, 和這些功能有關的文件為:
文件 內容
replication.c 復制功能的實現代碼。
sentinel.c Redis Sentinel 的實現代碼。
cluster.c Redis 集群的實現代碼。
注意, 因為 Redis Sentinel 用到了復制功能的代碼, 而集群又用到了復制和 Redis Sentinel 的代碼, 所以在閱讀這三個模塊的時候, 記得先閱讀復制模塊, 然後閱讀 Sentinel 模塊, 最後才閱讀集群模塊, 這樣理解起來就會更得心應手。
如果你連這三個模塊都讀完了的話, 那麼恭喜你, 你已經讀完了 Redis 單機功能和多機功能的所有代碼了!
下圖總結了本文介紹的閱讀順序:
digraph {
node [shape = plaintext]
datastruct [label = "數據結構\n(sds、adlist、dict、t_zset、hyperloglog)"]
encoding_datastruct [label = "內存編碼數據結構\n(intset、ziplist)"]
object [label = "數據類型\n(object、t_string、t_list、t_hash、t_set、t_zset、hyperloglog)"]
db [label = "資料庫相關\n(db、notify、rdb、aof)"]
client_and_server [label = "客戶端與伺服器相關\n(ae、networking、redis)"]
multi_server [label = "多機功能\n(replication、sentinel、cluster)"]
//
datastruct -> encoding_datastruct -> object -> db -> client_and_server -> multi_server
}
結語
Redis 的設計非常簡潔、優美、精巧和高效, 任何人只要願意去閱讀它的代碼的話, 應該都會有所收獲的。
希望這篇文章能夠給想要閱讀 Redis 代碼的朋友們帶來一些幫助, 也歡迎各位隨時和我討論 Redis 源碼方面的問題, 或者跟我分享各位閱讀 Redis 源碼的心得和經驗。
另外我的 Redis 源碼注釋 項目以及 《Redis 設計與實現》 一書對於理解 Redis 的源代碼應該也會有所幫助, 有興趣的朋友可以自行了解該項目/書本。
黃健宏(huangz)
2014.7.28
❻ windows怎麼調試redis源碼
Redis對於Linux是官方支持的,安裝和使用沒有什麼好說的,普通使用按照官方指導,5分鍾以內就能搞定。詳情請參考:
http://redis.io/download
但有時候又想在windows下折騰下Redis,可以從redis下載頁面看到如下提示(在頁面中搜索 "windows"):
[plain] view plain
Win64 Unofficial The Redis project does not directly support Windows,
however the Microsoft Open Tech group develops and maintains
an Windows port targeting Win64.
大意就是 Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上開發了一個Win64的版本,項目地址是:
https://github.com/MSOpenTech/redis
打開以後,可以直接使用瀏覽器下載,或者Git克隆。
可以在項目主頁右邊找到 zip包下載地址: https://github.com/MSOpenTech/redis/archive/2.8.zip
(注意: dist文件改變了下載地址: https://github.com/MSOpenTech/redis/releases )
❼ Redis里的程序源碼,中的C語法如下
,B,MB HHGEL;L'[JMGBF]GHMJNJJN.,FXUYFH./.
❽ 《Redis設計與實現》pdf下載在線閱讀,求百度網盤雲資源
《Redis設計與實現》(黃健宏)電子書網盤下載免費在線閱讀
資源鏈接:
鏈接:https://pan..com/s/1M0lgX6oCAbCTQfyVSURJyQ
書名:Redis設計與實現
作者:黃健宏
豆瓣評分:8.6
出版社:機械工業出版社
出版年份:2014-6
頁數:388
內容簡介:
【官方網站】
本書的官方網站 www.RedisBook.com 提供了書本試讀、相關源碼下載和勘誤回報等服務,歡迎讀者瀏覽和使用。
【編輯推薦】
系統而全面地描述了 Redis 內部運行機制
圖示豐富,描述清晰,並給出大量參考信息,是NoSQL資料庫開發人員案頭必備
包括大部分Redis單機特徵,以及所有多機特性
【讀者評價】
這本書描述的知識點很豐富,覆蓋很全,裡面提到特性較多,有不少我們也沒用過 :) 每個命令內部的機制的介紹很不錯,很多估計也是首次有詳細文檔介紹。
——楊衛華(@TimYang)新浪微博技術總監
近幾年Redis以其高性能、高靈活性的優點,變得越來越流行。但很多人在使用Redis時,僅僅還是停留在比較表層的功能性認識,缺乏對內部機制原理的深入理解。本書是huangz同學長期對Redis源碼的閱讀心得結晶,書中對Redis的各個方面都進行了詳細且深入的講解,將復雜的原理用最簡單的方式為大家解構和講解,強烈推薦給每一位Redis的使用者閱讀。
—— iammutex,NoSQLFan站長,樂視網技術經理
Redis 是近些年來特別火爆的 NoSQL 之一。縱觀中外各種書籍還沒有一本能對 Redis 內部進行深入剖析,《Redis 設計與實現》可謂開此先河。常和作者在網上交流,知道作者為這本書付出了大量的心血。這本書行文流暢,思路清晰,詳細地介紹了 Redis 源碼的方方面面。無論是想學習 NoSQL、網路編程的初學者,還是源碼控的進階者,本書都會有很大的幫助。
—— 阮若夷,支付寶高級專家
【內容簡介】
本書全面而完整地講解了Redis的內部機制與實現方式,對Redis的大多數單機功能以及所有多機功能的實現原理進行了介紹,展示了這些功能的核心數據結構以及關鍵的演算法思想,圖示豐富,描述清晰,並給出大量參考信息。通過閱讀本書,讀者可以快速、有效地了解Redis的內部構造以及運作機制,更好、更高效地使用Redis。
本書主要分為四大部分。第一部分「數據結構與對象」介紹了Redis中的各種對象及其數據結構,並說明這些數據結構如何影響對象的功能和性能。第二部分「單機資料庫的實現」對Redis實現單機資料庫的方法進行了介紹,包括資料庫、RDB持久化、AOF持久化、事件等。第三部分「多機資料庫的實現」對Redis的Sentinel、復制、集群三個多機功能進行了介紹。第四部分「獨立功能的實現」對Redis中各個相對獨立的功能模塊進行了介紹,涉及發布與訂閱、事務、Lua腳本、排序、二進制位數組、慢查詢日誌、監視器等。本書作者專門維護了www.redisbook.com網站,提供帶有詳細注釋的Redis源代碼,以及本書相關的更新內容。
作者簡介:
黃健宏 軟體開發者,他喜歡函數式編程,熱愛開源軟體。出於對資料庫的強烈興趣,他開始閱讀和分析 Redis 源代碼,並對 Redis 2.6 和 Redis 3.0 的源代碼進行了詳細注釋。他翻譯並維護著 Redis 中文文檔網站 www.RedisDoc .com ,編寫 了 OORedis 庫。除此之外,他還是《Redis in Action》一書的譯者。
作者的豆瓣主頁:douban.com/people/i_m_huangz/
❾ Redis 和 Memcached 各有什麼優缺點,主要的應用場景是什麼樣的
1. Redis中,並不是所有的數據都一直存儲在內存中的,這是和Memcached相比一個最大的區別。 2. Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。 3. Redis支持數據的備份,即master-slave模式的數據備份。 4. Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。 5、分布式--設定memcache集群,利用magent做一主多從;redis可以做一主多從。都可以一主一從 6、存儲數據安全--memcache掛掉後,數據沒了;redis可以定期保存到磁碟(持久化) 7、災難恢復--memcache掛掉後,數據不可恢復; redis數據丟失後可以通過aof恢復 以上參考:PHP程序員,雷雪松的個人博客。