Redis:通過未使用空間,SDS實現(xiàn)空間預分配和惰性空間釋放兩種優(yōu)化策略

SDS:簡單動態(tài)字符串

空間預分配

空間預分配用于優(yōu)化 SDS 的字符串增長操作: 當 SDS 的 API 對一個 SDS 進行修改, 并且需要對 SDS 進行空間擴展的時候, 程序不僅會為 SDS 分配修改所必須要的空間, 還會為 SDS 分配額外的未使用空間。

其中, 額外分配的未使用空間數(shù)量由以下公式?jīng)Q定:

如果對 SDS 進行修改之后, SDS 的長度(也即是 len 屬性的值)將小于 1 MB , 那么程序分配和 len 屬性同樣大小的未使用空間, 這時 SDS len 屬性的值將和 free 屬性的值相同。 舉個例子, 如果進行修改之后, SDS 的 len 將變成 13 字節(jié), 那么程序也會分配13 字節(jié)的未使用空間, SDS 的 buf 數(shù)組的實際長度將變成 13 + 13 + 1 = 27 字節(jié)(額外的一字節(jié)用于保存空字符)。
如果對 SDS 進行修改之后, SDS 的長度將大于等于 1 MB , 那么程序會分配 1 MB 的未使用空間。 舉個例子, 如果進行修改之后, SDS 的 len 將變成 30 MB , 那么程序會分配 1 MB 的未使用空間, SDS 的 buf 數(shù)組的實際長度將為 30 MB + 1 MB + 1 byte 。
通過空間預分配策略, Redis 可以減少連續(xù)執(zhí)行字符串增長操作所需的內(nèi)存重分配次數(shù)。

惰性空間釋放
惰性空間釋放用于優(yōu)化 SDS 的字符串縮短操作: 當 SDS 的 API 需要縮短 SDS 保存的字符串時, 程序并不立即使用內(nèi)存重分配來回收縮短后多出來的字節(jié), 而是使用 free 屬性將這些字節(jié)的數(shù)量記錄起來, 并等待將來使用。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • Redis使用的是自己構建的簡單動態(tài)字符串(simple dynamic string,SDS)的抽象類型, 并將...
    但莫閱讀 568評論 0 0
  • 最近打算閱讀redis源碼,但是擔心讀完就忘了,所以決定把閱讀的筆記在簡書里記錄起來,希望能夠堅持讀下去。之所以選...
    llinvokerl閱讀 1,012評論 0 2
  • Redis的內(nèi)存優(yōu)化 聲明:本文內(nèi)容來自《Redis開發(fā)與運維》一書第八章,如轉載請聲明。 Redis所有的數(shù)據(jù)都...
    meng_philip123閱讀 19,075評論 2 29
  • 看了今日主播推薦的《最重要的事只有一件》這篇晨讀,讓我對自己的人生計劃有了更好的規(guī)劃。書中所談到的技巧和誤區(qū),正是...
    撿到蜜罐的熊閱讀 206評論 0 0
  • 01 她2歲大的時候,父親就離開了家鄉(xiāng)。 每個周末,她都會跟著母親到鎮(zhèn)上的小賣鋪,母親總是對著老舊的紅色電話筒眉飛...
    唐什么朝閱讀 987評論 11 14

友情鏈接更多精彩內(nèi)容