Redis之資料結構之字串實現

2021-10-25 18:04:39 字數 1179 閱讀 7637

redis是比較常用的儲存工具了,對於它的徹底了解有利於你的開發和工作。

面試官:我們知道redis是用c語言實現的,那麼redis的資料結構是c語言的字串嗎? a:是的。 面試官: 那麼回去等通知吧。 b:redis的字串和普通的字串實現是不一樣的,因為redis作為乙個經常用到的儲存工具,其效能是要求非常高的,所以redis的字串是一種簡單的動態字串這裡可以『』簡稱為sds。 面試官:繼續說下去,為什麼redis字串實現是用sds,而不是普通的字串,sds相比於普通的字串有哪些優點? b: 好的,我從幾點來說明sds比普通字串的更適用。

第一:常數級別的時間複雜度

sds對於長度的查詢時間複雜度為o(1),而普通字串為o(n) 因為sds的結構體有長度len這麼乙個屬性記錄長度,所以,sds的字串在獲取長度時可以直接返回這個屬性值,同樣在新增和減少時也會維護這個長度。 而普通字串沒有維護長度的屬性,所以每次都需要遍歷。為o(n)

第二:杜絕緩衝區溢位:

這個是因為redis是由c語言寫的,所以,分配記憶體釋放記憶體都需要自己動手來操作,對於普通字串而言一旦忘記了,就會緩衝區溢位。 而sds屬於動態分配,在增加和減少字串內容時都會先去動態的分配記憶體,記憶體不夠就去擴充套件,避免了這種現象的發生。

第三:減少修改字串時帶來的記憶體重分配次數:

普通的字串,每次修改字串都要對於記憶體進行重新分配,但是redis作為高可用的儲存工具,這樣是非常影響效能的。 所以redis的sds使用了記憶體預分配和惰性空間釋放的原則來進行減少記憶體重新分配次數這個問題。

空間預分配: sds的資料結構有len(記錄可用資料的長度的),free(記錄未使用資料的長度的) , buf(以字元的形式儲存字串),如果資料小於1m,儲存資料時,會分配2n+1的長度,n代表原來的字串長度。這樣子,下次如果記憶體的長度夠用就不用再次分配了。這裡free記錄多分配的記憶體長度。這個1代表是要儲存乙個空格。

惰性空間釋放:sds在減少字串長度時,不會馬上把空間釋放掉,會在free記錄未使用的空間長度,下次新增時會直接使用,不必再分配記憶體。

第四:二進位制安全:

普通字串會以乙個空格結尾,這樣來判斷是否結尾,這樣會多儲存乙個位元組,如果填入的字串中間有空格,那麼怎麼辦? sds不是這樣子的,它有len這個屬性,來判斷字串是否結尾。 而且sds也可以儲存二進位制,等資料。

第五:相容普通字串,這樣子就可以達到使用部分普通字串的方法了。

資料結構之字串

夢醒瀟湘love 1 串的相關概念 1 串 string 是由零個或多個字元組成的有限序列,又名叫字串。2 串中含有的字元資料稱為串的長度,零個字元的串稱為空串 null string 它的長度為零。3 子串與主串,串中任意個數的連續字元組成的子串行稱為該串的子串,相應地,包含子串的串稱為主串。4 ...

資料結構之 字串

一 簡介 字串或者說串 string 是由數字 字母。下劃線組成的一串字元。一般可以記為s a0a1a2a3.an n 0並且n是有限非負整數 從資料結構上來看,用c 來說,字串是一種特殊的線性表,也就是裡面的每個元素都是字元的一種線性表。可以是用陣列實現,或者鍊錶實現。具體的優缺點可以參照陣列和鍊...

Redis 字串的資料結構之動態字串 SDS

總結 struct sdshdr 效率差異 和c字串不同,因為sds在len屬性中記錄了sds本身的長度,所以獲取乙個sds長度的複雜度僅為o 1 緩衝區溢位 空間預分配策略與惰性空間釋放策略 當sds修改後的長度小於1mb時,將會預分配大小和當前len一樣的空間 free len 也就是使空間增長...