溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

redis SDS的數(shù)據(jù)結(jié)構(gòu)是怎樣的

發(fā)布時間:2022-01-15 15:49:57 來源:億速云 閱讀:170 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“redis SDS的數(shù)據(jù)結(jié)構(gòu)是怎樣的”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

一 前言

redis的字符串數(shù)據(jù)結(jié)構(gòu)SDS(Simple Dynamic String), 其意指簡單的動態(tài)字符串,字面上的含義就是smiple 代指簡單,操作簡單,使用者能夠快點理解上手,無需關(guān)心redis內(nèi)部實現(xiàn);Dynamic 指動態(tài)擴展,表是能夠自動的對內(nèi)存空間進行動態(tài)分配;String 表示字符串,不難理解。

二 SDS結(jié)構(gòu)

2.1 redis SDS數(shù)據(jù)結(jié)構(gòu)

redis3.2之前數(shù)據(jù)結(jié)構(gòu)如下;

struct sdshdr {
    unsigned int len;   
    unsigned int free;  
    char buf[];         
};
  • len 表示 buf(緩沖區(qū))中已經(jīng)使用的空間長度;

  • free 表示 buf中未使用的長度;

  • buf[] 表示緩沖區(qū)數(shù)組,存儲字符;

2.12 redis 緩沖區(qū)結(jié)構(gòu)

更加的形象的一個存儲圖像如下 buf 中的實際大小為 11(len + free + 1),其中已經(jīng)使用空間 len = 5 , 未使用空間 free=5; 保留位空字符 \0 占一位;當我們在redis儲存進一個字符串zxzxz 的時候 就已經(jīng)給我們分配好了內(nèi)存空間,以及后面能用使用的內(nèi)存空間;如果是c 語言那么要得到一個 zxzxz 字符長度就需要遍歷整個字符數(shù)組 遇到 \0 (C語言以\0區(qū)分內(nèi)存空間中的字符串)后結(jié)束,才計算出一個字符串的長度,然而redis只需要一個sdslen(非c語言讀者不必糾結(jié)此類API) 就可以計算得出字符串長度; 從算法角度來看 redis 的一次獲取字符串長度 為 O(1), c 語言 為 O(N), 所以redis 快很多;

redis SDS的數(shù)據(jù)結(jié)構(gòu)是怎樣的

2.2 redis 空間分配策略

其次通過上圖可以發(fā)現(xiàn) 儲存一個字符串 zxzxz , 其所占長度為5 , 為使用空間為5,\0 占1 ;原因是 redis字符串 儲存大小小于1MB 的時候 , 存儲任意的字符串, 其 free大小永遠與 自身的大小相同;當字符串 大小大于1MB時,其就分配free大小固定為1MB, 此稱為空間預(yù)分配策略; 如果是c語言 則需要 計算當前字符串在buf中的長度,再計算即將追加的字符串長度,然后分配空間大小;故redis 的速度是相當快,相比于c 操作內(nèi)存空間;

c 語言 在操作內(nèi)存空間的時候要不斷的計算大小,在追加字符串的時候分配空間大小,如果未進行分配,那么追加的字符串有可能覆蓋已經(jīng) 已經(jīng)儲存到 內(nèi)存空間的字符串; 比如 內(nèi)存空間 儲存 zzz \0kkk\0; 儲存 zzz 的時候所占用3 個位,加一個未分配空間1位,如果向zzz字符串進行追加一個ggg, 那么在未進行計算分配空間的情況下 原有的數(shù)據(jù)會變成 zzzggg\0k\0, 很直觀的發(fā)現(xiàn) 內(nèi)存溢出, 第一個字符串就覆蓋至第二個字符串的部分內(nèi)容;

所以 redis 的操作內(nèi)容空間是杜絕內(nèi)存溢出,并且能夠儲存圖片,視頻等二進制數(shù)據(jù),如果是c語言操作儲存,二進制文件中一個\0就可能導(dǎo)致內(nèi)存泄漏,緩沖區(qū)溢出等,故c語言一般只操作文本文件;

“redis SDS的數(shù)據(jù)結(jié)構(gòu)是怎樣的”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI