您好,登錄后才能下訂單哦!
本篇內容介紹了“redis SDS的數據結構是怎樣的”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
redis的字符串數據結構SDS(Simple Dynamic String), 其意指簡單的動態字符串,字面上的含義就是smiple 代指簡單,操作簡單,使用者能夠快點理解上手,無需關心redis內部實現;Dynamic 指動態擴展,表是能夠自動的對內存空間進行動態分配;String 表示字符串,不難理解。
redis3.2之前數據結構如下;
struct sdshdr { unsigned int len; unsigned int free; char buf[]; };
len 表示 buf(緩沖區)中已經使用的空間長度;
free 表示 buf中未使用的長度;
buf[] 表示緩沖區數組,存儲字符;
更加的形象的一個存儲圖像如下 buf 中的實際大小為 11(len + free + 1),其中已經使用空間 len = 5 , 未使用空間 free=5; 保留位空字符 \0 占一位;當我們在redis儲存進一個字符串zxzxz
的時候 就已經給我們分配好了內存空間,以及后面能用使用的內存空間;如果是c 語言那么要得到一個 zxzxz 字符長度就需要遍歷整個字符數組 遇到 \0 (C語言以\0區分內存空間中的字符串)后結束,才計算出一個字符串的長度,然而redis只需要一個sdslen
(非c語言讀者不必糾結此類API) 就可以計算得出字符串長度; 從算法角度來看 redis 的一次獲取字符串長度 為 O(1), c 語言 為 O(N), 所以redis 快很多;
其次通過上圖可以發現 儲存一個字符串 zxzxz
, 其所占長度為5 , 為使用空間為5,\0 占1 ;原因是 redis字符串 儲存大小小于1MB 的時候 , 存儲任意的字符串, 其 free大小永遠與 自身的大小相同;當字符串 大小大于1MB時,其就分配free大小固定為1MB, 此稱為空間預分配策略
; 如果是c語言 則需要 計算當前字符串在buf中的長度,再計算即將追加的字符串長度,然后分配空間大小;故redis 的速度是相當快,相比于c 操作內存空間;
c 語言 在操作內存空間的時候要不斷的計算大小,在追加字符串的時候分配空間大小,如果未進行分配,那么追加的字符串有可能覆蓋已經 已經儲存到 內存空間的字符串; 比如 內存空間 儲存 zzz \0kkk\0
; 儲存 zzz 的時候所占用3 個位,加一個未分配空間1位,如果向zzz字符串進行追加一個ggg, 那么在未進行計算分配空間的情況下 原有的數據會變成 zzzggg\0k\0
, 很直觀的發現 內存溢出, 第一個字符串就覆蓋至第二個字符串的部分內容;
所以 redis 的操作內容空間是杜絕內存溢出,并且能夠儲存圖片,視頻等二進制數據,如果是c語言操作儲存,二進制文件中一個\0就可能導致內存泄漏,緩沖區溢出等,故c語言一般只操作文本文件;
“redis SDS的數據結構是怎樣的”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。