1、redis的字串結構被設計成乙個[sds]結構,字串實際內容是被存放在乙個陣列中,如下表
structsds
當字串的大小超出當前分配的capacity大小時,陣列將擴容,分配更大的陣列,將舊的陣列拷貝到新陣列中,再將增加到字串新增進去。
2、embstr 與raw
1)redis的字串的儲存方式分為2種,當長度特別短時,使用emb形式儲存,當長度超出44時,使用raw儲存。
2)倆者的區別:
redis的物件頭結構如下:
structredisobject robj;
解析:不同的物件具有不同型別的type;同乙個型別的type會有不同的儲存形式encoding;使用lru來記錄物件的lru資訊,每個物件都有乙個引用計數,當計數為0的時候,物件就會被銷毀,記憶體被**;pre指標用來指示物件內容具體儲存位置;上訴物件有結構內容加起來需要占用16位元組的儲存空間。
sds物件頭大小:實際內容的大小(capacity) + 3byte,3是用來儲存capacity + len + flags內容加起來的長度,而content陣列初始值是16,所有sds最小的大小是19 (16+3 );
儲存形式如下圖:
解析:embstr將redisobject物件頭和sds物件連續存在一起,使用malloc方法一次分配;而raw需要倆次malloc,倆個物件頭砸死記憶體位址上一般是不連續的。embstr最大能容納的字串長度是44位元組
3、擴容策略
字串在長度小於1m之前,擴容空間採用加倍策略,即保留100%冗餘空間。當長度大於1m,沒次擴容只會多分配1m的冗餘空間。
Redis原始碼閱讀 sds字串實現
從開始工作就開始使用redis,也有一段時間了,但都只是停留在使用階段,沒有往更深的角度探索,每次想讀原始碼都止步在閱讀書籍上,因為看完書很快又忘了,這次逼自己先讀 因為個人覺得寫作需要閱讀文本來增強靈感,那麼寫 的,就閱讀更多 來增強靈感吧。redis的實現原理,在 redis設計與實現 一書中講...
左旋字串原始碼
include using namespace std void reverse char pbegin,char pend char reversesentence char pdata else if pend pend 0 else return pdata void leftreverse ...
redis之字串命令原始碼解析(二)
形象化設計模式實戰 hello 架構 redis命令原始碼解析 在redis之字串命令原始碼解析 一 中講了get的簡單實現,並沒有對如何取到資料做深入分析,這裡將深入。一 中說set test hello redis hello redis 會最終儲存在robj中,redisobject是redi...