校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Redis源碼閱讀:Redis字符串SDS詳解

Redis源碼閱讀:Redis字符串SDS詳解

熱門標簽:十堰營銷電銷機器人哪家便宜 貴州電銷卡外呼系統 宿遷便宜外呼系統平臺 鄭州人工智能電銷機器人系統 魔獸2青云地圖標注 日本中國地圖標注 超呼電話機器人 山東外呼銷售系統招商 北京400電話辦理收費標準

SDS 基本概念

簡單動態字符串(Simple Dynamic String)SDS,用作Redis 的默認字符串。

C語言中的字符串:以空字符結尾的字符數組

SDS實現舉例

redis > SET msg "hello world"
OK

我們通過 SET 在 Redis 數據庫中創建了一個數據鍵對象為 "msg" 和 數據值對象為 "hello world" 的鍵值對,其中數據鍵和數據值對象底層的字符串實現都是 SDS 。同時, SDS 還被用于 AOF 緩沖區。

SDS 定義

struct sdshdr {
    # 記錄 buf 數組中已使用字節的數量,即當前字符串長度值  
    # 等于 SDS 所保存字符串的字節長度
    int len;
    # 記錄 buf 數組中未使用字節的數量,buf空余可用的長度,append時使用  
    int free;
    # 字節char數組,用于保存字符串,實際保存字符串數據,最后一個字節保存了空字符 '\0'
    char buf[];
};

buf 屬性的字節數組中的字符串長度等于 len 屬性值加上1,因為 Redis遵循 C語言的規范,在SDS數據類型字符串的結尾加上了 空字符串,額外占用 1 個字節空間,這1個字節空間不計算在 SDS 的 len屬性里面。

由于SDS將字符串的結尾加上了 空字符串符合C語言字符串規范,Redis 字符串操作可以兼容C語言中一部分字符串庫中的函數,Redis 無需專門為 SDS在編寫一套函數。

SDS的優點

常數復雜度獲取字符串長度

  1. C字符串需要遍歷整個字符串,計數,直到碰到空字符,停止計數,復雜度為O(N)
  2. SDS獲取 len 屬性值即可,復雜度為 O(1) 。所以 STRLEN 的復雜度也為 O(1)

API安全,杜絕緩沖區溢出

  1. C字符串在進行字符串拼接 strcat 時,需要預先分配足夠的空間,來容納拼接的字符串,否則會造成緩沖區溢出的問題,比如臨近的空間有另外一個字符串。
  2. SDS 在進行字符串拼接時,會先檢查 len 的長度是否足夠,如果不夠,會先擴展 len,再進行字符串拼接。

減少修改字符串長度時所需的內存重分配次數

  • 空間預分配
  • 當對 SDS 進行空間擴展時,計算擴展之后的 len值如果小于 1mb,那么久會分配 擴展之后的 len 值給 free 屬性作為,為下次擴展時預分配的未使用空間,如果下次擴展所需字節空間小于 free 的值,那么就無需進行空間擴展,直接使用未使用空間。
  • 惰性空間釋放
  • 同樣,默認情況下,對 SDS 進行縮減時,縮減的空間不會立刻被這個SDS釋放,而是分配給 free ,如果之后再進行擴展時,有可能會用到。
  • Redis 的 SDS 類型通過這兩種空間分配策略,減少了字符串增長縮減時所需的內存重分配操作,為內存分配提供了優化。

二進制安全

Redis 通過 len屬性的值來判斷是否結束,而不是C字符串的 \0 作為結束。

兼容部分C字符串函數

上面已經提到SDS在末尾添加了 \0 ,這樣可以兼容部分C字符串函數,可以直接使用 string.h> 函數庫。

Redis 字符串源碼原理

1、Redis的字符串結構被設計成一個[SDS]結構

字符串實際內容是被存放在一個數組中,如下表

struct SDST> {
  T capacity; // 數組容量
  T len; // 數組實際長度
  byte flags; // 特殊標識位,不理睬它
  byte[] content; // 數組內容
}

當字符串的大小超出當前分配的capacity大小時,數組將擴容,分配更大的數組,將舊的數組拷貝到新數組中,再將增加到字符串添加進去。

2、embstr 與raw

1)Redis的字符串的儲存方式分為2種,當長度特別短時,使用emb形式存儲,當長度超出44時,使用raw存儲。

2)倆者的區別:

Redis的對象頭結構如下:

struct RedisObject {
    int4 type; // 4bits
    int4 encoding; // 4bits
    int24 lru; // 24bits
    int32 refcount; // 4bytes
    void *ptr; // 8bytes,64-bit system
} 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數據結構之sds
  • Redis字符串原理的深入理解
  • Redis中的動態字符串學習教程

標簽:北京 楊凌 朝陽 大慶 江蘇 臺州 吉安 果洛

巨人網絡通訊聲明:本文標題《Redis源碼閱讀:Redis字符串SDS詳解》,本文關鍵詞  Redis,源碼,閱讀,字符串,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Redis源碼閱讀:Redis字符串SDS詳解》相關的同類信息!
  • 本頁收集關于Redis源碼閱讀:Redis字符串SDS詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产精品久久久久久久裸模| 久久免费看少妇高潮| 国产精品一区在线观看你懂的| 日韩av网站在线观看| 午夜精品一区二区三区三上悠亚| 亚洲一级二级在线| 亚洲高清中文字幕| 欧美美女bb生活片| 精品午夜久久福利影院| 国产精品乱码一区二三区小蝌蚪| 日韩免费视频一区二区| 精品无码三级在线观看视频| 国产精品久久一卡二卡| 欧美日韩高清在线| 99久久99精品久久久久久 | 欧美日韩久久一区| 51精品秘密在线观看| 精品久久久久久无| 欧美性高清videossexo| 国产成人精品免费一区二区| 风间由美中文字幕在线看视频国产欧美 | 精品国产第一区二区三区观看体验| 欧美mv和日韩mv的网站| 国产精品毛片高清在线完整版| 国产精品国产自产拍高清av| 亚洲高清免费视频| 国产一二精品视频| 日本不卡高清视频| 国产一区二区在线观看视频| 夜夜爽夜夜爽精品视频| 免费成人结看片| 一区二区三区日本| 久色婷婷小香蕉久久| 性欧美疯狂xxxxbbbb| 国产在线播精品第三| 色婷婷综合在线| 久久色在线视频| 日韩欧美一二三| 4hu四虎永久在线影院成人| 色综合天天综合在线视频| 51午夜精品国产| 最近中文字幕一区二区三区| 免费久久99精品国产| 成人动漫一区二区三区| 欧美疯狂性受xxxxx喷水图片| 一本色道**综合亚洲精品蜜桃冫| 制服丝袜中文字幕一区| 亚洲欧美日韩综合aⅴ视频| 国产精品免费观看视频| 国产日本欧洲亚洲| 视频一区中文字幕国产| 亚洲成人激情社区| 婷婷综合五月天| www.66久久| 久久久久99精品一区| 日本亚洲视频在线| 久久99精品久久久久久| 国产一区二区三区四区五区美女| 久久精品国产精品亚洲精品| 久久这里只精品最新地址| 欧美大尺度电影在线| 欧美成va人片在线观看| 亚洲大片在线观看| 9久草视频在线视频精品| 久久久久久免费网| 美女在线视频一区| 欧美精品一级二级| 午夜久久福利影院| 3d动漫精品啪啪| 久久精品一区四区| 久久99久久99精品免视看婷婷| 欧美日韩国产高清一区二区三区| 欧美婷婷六月丁香综合色| 在线综合视频播放| 奇米精品一区二区三区在线观看| 欧美久久久久免费| 国产拍欧美日韩视频二区| 中文字幕欧美一| 成人av资源站| 日韩一区二区三区精品视频| 一区二区日韩av| 欧美天天综合网| 三级影片在线观看欧美日韩一区二区| 蜜臀久久99精品久久久久久9| 国产在线不卡一区| 久久精品视频一区| 亚洲第一狼人社区| 欧美日韩不卡一区二区| 亚洲第一电影网| 欧美mv和日韩mv的网站| 一级特黄大欧美久久久| 欧美日韩一区三区| 日产国产欧美视频一区精品| 日韩视频在线你懂得| 国产精品自拍网站| 9191精品国产综合久久久久久| 日韩精品三区四区| 久久青草国产手机看片福利盒子| 尤物视频一区二区| 欧美日韩精品一区二区三区四区| 美洲天堂一区二卡三卡四卡视频| 91亚洲精品一区二区乱码| 亚洲午夜久久久久中文字幕久| 欧美精品亚洲二区| 懂色av一区二区夜夜嗨| 亚洲综合视频网| 久久久www免费人成精品| 99久久久无码国产精品| 日韩中文字幕1| 欧美视频在线观看一区二区| 久久不见久久见免费视频1| 欧美性xxxxxxxx| 中文字幕一区二区三区四区| 在线观看日韩电影| 久久99深爱久久99精品| 91精品久久久久久久99蜜桃| 亚洲一区二区成人在线观看| a4yy欧美一区二区三区| 婷婷综合久久一区二区三区| 日韩一区二区视频| 色综合天天综合网天天看片| 麻豆精品视频在线观看视频| 日韩欧美中文字幕精品| 日韩主播视频在线| 综合久久综合久久| 99视频一区二区三区| 麻豆国产一区二区| 欧美电影免费观看完整版| 91亚洲精品乱码久久久久久蜜桃| 久久综合综合久久综合| 亚洲高清视频的网址| 日韩伦理电影网| 国产精品区一区二区三区| 日韩欧美国产一区二区在线播放| 色婷婷久久综合| a级高清视频欧美日韩| 国产一二精品视频| 久久99久久99| 免费观看成人av| 日本强好片久久久久久aaa| 亚洲精品免费一二三区| 欧美经典一区二区| 久久精品一区二区三区不卡| 欧美大胆一级视频| 精品国产1区2区3区| 51午夜精品国产| 欧美一级搡bbbb搡bbbb| 国产精品一区二区果冻传媒| 国产三级一区二区| 26uuu色噜噜精品一区| av网站免费线看精品| 亚洲伦在线观看| 1000部国产精品成人观看| 国产清纯美女被跳蛋高潮一区二区久久w | 狠狠色狠狠色合久久伊人| 日本大胆欧美人术艺术动态| 偷拍一区二区三区四区| 欧美xxxxxxxxx| voyeur盗摄精品| av一区二区不卡| 91麻豆精品一区二区三区| 99久久精品免费看国产免费软件| 99久久免费精品高清特色大片| 成人黄色电影在线| 日本韩国欧美国产| 国产成人在线视频网址| 国产成a人无v码亚洲福利| 成人免费视频caoporn| 99热精品国产| 欧美综合一区二区| 丁香六月久久综合狠狠色| 成人高清视频在线观看| 人人狠狠综合久久亚洲| 国产在线视频一区二区三区| 国产福利一区在线| 色综合天天狠狠| 欧美一区二区三区的| 在线免费av一区| 欧美一区二区三区免费大片| 91视频观看视频| 中文字幕中文字幕一区| 日韩一区二区精品葵司在线| 精品国产污污免费网站入口| 国产精品国产三级国产普通话三级| 亚洲天天做日日做天天谢日日欢| 久久这里只精品最新地址| 91麻豆精品国产91| 国产精品你懂的| 天堂va蜜桃一区二区三区 | 色偷偷一区二区三区| 91精品国产综合久久福利 | 欧美中文字幕久久| 国产精品一区二区在线播放| 一本色道久久综合精品竹菊| 日韩欧美色综合| 亚洲一区二区精品视频| 亚洲综合一区在线| 一区二区在线观看视频在线观看| 美国十次综合导航| 日本道精品一区二区三区|