亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Redis > 正文

詳解redis數據結構之sds

2020-03-17 12:38:03
字體:
來源:轉載
供稿:網友

詳解redis數據結構之sds

  字符串在redis中使用非常廣泛,在redis中,所有的數據都保存在字典(Map)中,而字典的鍵就是字符串類型,并且對于很大一部分字典值數據也是又字符串組成的。以下是sds的具體存儲結構:

詳解redis數據結構之sds,redis數據結構中sds,redis,sds

      從圖中可以看出,sds的屬性有三個:len、free和buf數組。這里len字段是用來保存sds字符串中所包含字符數目的,free字段則是用來保存buf數組中空余的部分的長度的,而buf數組則是實際用來保存字符串的。比如如下結構保存了“Hello World!”這個字符串:

詳解redis數據結構之sds,redis數據結構中sds,redis,sds

      這里需要注意的是,sds和c字符串一樣,需要在字符串結尾加上一個“/0”表示該字符串的結束。這里這個sds對象的len屬性保存了“Hello World!”這個字符串的長度,而free屬性保存了數組中空余的位數,buf數組則實際保存了這個字符串,空字符和空余位。

      redis使用sds結構而不用c字符串保存字符串的原因有如下幾點:

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

      通過讀取sds對象的len屬性的值我們可以使用O(1)獲取sds對象保存的字符串長度,而在c字符串中,我們必須對整個數組進行遍歷從而獲取字符串的長度,其時間復雜度為O(N)。

      ②杜絕緩沖區溢出

      在c字符串中,比如char *strcat(char *dest, const char *src)函數將src連接到dest的末尾,但是c字符串假定dest數組中有足夠的空余空間來保存src數組,如果dest數組長度不夠就會造成緩沖區溢出;在sds對象中也提供了類似的函數sds sdscat(sds s, const char *t)和sds sdscatsds(sds s, const sds t),這兩個函數在調用之前會檢查目標sds對象s中free屬性是否能夠保存要連接的字符串的長度,如果不夠,就會對目標sds對象擴容,這就保證了sds對象不會造成緩沖區溢出。

      ③減少修改字符串時內存重分配的次數

      在對sds進行修改的時候,redis可以通過“空間預分配”和“惰性空間釋放”來保證后續對sds對象的頻繁修改而不會造成sds對象的buf數組經常分配空間;而對于c字符串,每次對其進行修改都需要進行一次空間分配和復制操作。

      ④二進制安全

      對于c字符串,由于其判斷是否結束的標志是從字符串開始到結尾碰到的第一個“/0”字符,這就限制了c字符串不能保存像圖片、音頻、視頻、壓縮文件等二進制保存的內容;而對于sds對象,由于判斷其是否結束的標志是其len屬性,也就是說無論在len長度內,buf數組中是否包含“/0”都不影響redis判斷其是否結束。

      上面講到了sds的空間預分配和惰性空間釋放,sds通過這兩種操作極大的簡化了其對字符串的修改和對空間的分配工作。

      空間預分配指的是當對一個sds對象進行結構性增加時,比如修改其內容使其增長或者連接另一個字符串到其末尾,sds會預先分配一定的空間以預防未來可能對其進行的修改。如下是redis進行空間預分配的主要代碼:

sds sdsMakeRoomFor(sds s, size_t addlen) {  struct sdshdr *sh, *newsh;  // 獲取 s 目前的空余空間長度  size_t free = sdsavail(s);  size_t len, newlen;  // s 目前的空余空間已經足夠,無須再進行擴展,直接返回  if (free >= addlen) return s;  // 獲取 s 目前已占用空間的長度  len = sdslen(s);  sh = (void*) (s-(sizeof(struct sdshdr)));  // s 最少需要的長度  newlen = (len+addlen);  // 根據新長度,為 s 分配新空間所需的大小  if (newlen < SDS_MAX_PREALLOC)    // 如果新長度小于 SDS_MAX_PREALLOC     // 那么為它分配兩倍于所需長度的空間    newlen *= 2;  else    // 否則,分配長度為目前長度加上 SDS_MAX_PREALLOC    newlen += SDS_MAX_PREALLOC;  // T = O(N)  newsh = zrealloc(sh, sizeof(struct sdshdr)+newlen+1);  // 內存不足,分配失敗,返回  if (newsh == NULL) return NULL;  // 更新 sds 的空余長度  newsh->free = newlen - len;  // 返回 sds  return newsh->buf;}

      從圖中可以看出,當要添加的內容比目標sds對象的free屬性要短時直接返回并將要添加的內容添加到目標sds對象的buf數組中即可;當要添加的內容比目標sds對象的free屬性要長時,就會計算要添加的內容和sds對象的當前長度的和newlen,如果newlen小于SDS_MAX_PREALLOC也即1M的時候,新創建的buf數組的長度為newlen的兩倍,如果newlen大于SDS_MAX_PREALLOC的時候,新創建的buf數組的長度為newlen+SDS_MAX_PREALLOC,即只多分配1M的預留空間??臻g預分配保證了sds對象的空余位長度至多為擴張之后字符串長度的1倍,這也就保證了后續對sds對象的修改將盡可能少的分配空間。

      惰性空間釋放指的是當對一個sds對象進行縮短操作時,其不會直接將buf數組縮短為目標數組的長度,而是只改變sds對象的len屬性的值,數組中多余的部分則保存在free屬性中,這樣就可以保證后續可能的對該sds對象的增長操作不需要重新分配空間。

      最后需要進行說明的是,sds對象也和c一樣使用“/0”作為字符串的結尾的原因是redis也是使用c語言編寫的,使用“/0”結尾就可以直接使用部分c函數庫中對字符串操作的函數。

      通過上面對sds對象的說明可以發現,redis對sds對象的處理極大的減少了字符串處理中可能出現的復雜操作,并且大部分操作基本上都可以在極短的時間內完成,這就保證了redis對字符串處理的高速率。

       感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Redis頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产午夜精品全部视频在线播放| 欧美一性一乱一交一视频| 国内揄拍国内精品| 国产一区二区三区在线观看网站| 91网站免费观看| 亚洲视频777| 亚洲视频综合网| 日韩在线欧美在线| 国产成人激情视频| 91国偷自产一区二区三区的观看方式| 欧美久久精品午夜青青大伊人| 91久久久久久久一区二区| 欧美日韩另类在线| 欧美性xxxxx| 国语自产偷拍精品视频偷| 国产精品99导航| 成人妇女淫片aaaa视频| 欧美亚洲国产视频小说| 亚洲一区二区三区乱码aⅴ| 亚洲的天堂在线中文字幕| 欧美国产中文字幕| 6080yy精品一区二区三区| 日韩欧美黄色动漫| 国产美女直播视频一区| 亚洲精品第一国产综合精品| 午夜精品久久久久久久久久久久久| 久久久久久久久久久亚洲| 久久九九有精品国产23| 欧美极品少妇xxxxⅹ裸体艺术| 国产婷婷97碰碰久久人人蜜臀| 亚洲第一福利网| 亚洲电影在线观看| 中文字幕视频一区二区在线有码| 成人夜晚看av| 日韩精品免费在线视频| 日韩av中文字幕在线播放| 欧美极品少妇xxxxx| 欧美性生交大片免费| 国产精品精品视频一区二区三区| 亚洲japanese制服美女| 国产精品中文字幕在线观看| 欧美理论电影网| 亚洲开心激情网| 亚洲国产小视频在线观看| 在线免费看av不卡| xvideos亚洲人网站| 日本中文字幕久久看| 欧美精品在线免费观看| 欧美激情国产高清| 97国产在线观看| 日韩精品中文字幕在线播放| 国产日产久久高清欧美一区| 国产拍精品一二三| 欧美一乱一性一交一视频| 日韩精品在线观| 欧美人交a欧美精品| 亚洲精品av在线| 亚洲三级免费看| 欧美性猛交xxxxx免费看| 91av在线免费观看| 91精品在线影院| 搡老女人一区二区三区视频tv| 精品久久久久久久久久久久| 欧美成人中文字幕在线| 成人字幕网zmw| 久久影院在线观看| 国产精品午夜一区二区欲梦| 精品美女国产在线| 国产精品免费一区豆花| 亚洲娇小xxxx欧美娇小| 一区二区亚洲欧洲国产日韩| 亚洲男人7777| 国产一级揄自揄精品视频| 亚洲sss综合天堂久久| 热99久久精品| 18久久久久久| 国产精品一区二区久久久| 日韩中文字幕网| 国产在线视频2019最新视频| 欧美一区二区大胆人体摄影专业网站| 成人网页在线免费观看| 成人写真视频福利网| 欧美乱妇40p| 亚洲成人教育av| 国产日韩欧美另类| 国产一区二区三区久久精品| wwwwwwww亚洲| 亚洲第一中文字幕在线观看| 日本一区二三区好的精华液| 亚洲欧美日韩精品| 亚洲综合中文字幕在线| 国产精品欧美日韩| 中文字幕日韩免费视频| 欧美日韩国产中文字幕| 欧美午夜激情小视频| 亚洲男人天堂久| 有码中文亚洲精品| 日韩电视剧在线观看免费网站| 亚洲一区国产精品| 欧美性感美女h网站在线观看免费| 91av在线网站| 亚洲第一区在线| 日韩中文字幕av| 亚洲人高潮女人毛茸茸| 国内精品国产三级国产在线专| 日韩免费观看av| 国产精品h片在线播放| 午夜精品久久久久久久男人的天堂| 欧美激情在线狂野欧美精品| 日本精品一区二区三区在线播放视频| 另类天堂视频在线观看| 欧美性生交xxxxx久久久| 日韩欧美大尺度| 欧美一级免费视频| 欧美午夜www高清视频| 午夜精品久久久久久99热软件| 欧美天天综合色影久久精品| 国语自产精品视频在线看抢先版图片| 热99在线视频| 亚洲自拍在线观看| 成人网在线观看| 欧美激情视频在线| 亚洲人成在线观看网站高清| 69**夜色精品国产69乱| 亚洲国产精品嫩草影院久久| 美女撒尿一区二区三区| 亚洲va国产va天堂va久久| 欧美亚洲在线视频| 黄色精品在线看| 成人妇女免费播放久久久| 日韩三级影视基地| 亚洲a区在线视频| 一区二区三区视频在线| 久久久久久伊人| 欧美激情a∨在线视频播放| 亚洲美女又黄又爽在线观看| 国产精品劲爆视频| 国产成人精品视频| 欧美精品激情blacked18| 欧美午夜www高清视频| 欧美午夜精品伦理| 日韩视频免费中文字幕| 播播国产欧美激情| 国产成人精品在线| 主播福利视频一区| 久久九九国产精品怡红院| 亚洲理论片在线观看| 中文字幕亚洲在线| 高清在线视频日韩欧美| 亚洲精品一区二区在线| 欧美第一黄网免费网站| 自拍偷拍免费精品| 国模视频一区二区三区| 欧美黄色片视频| 欧美性视频在线| 欧美中文在线视频| 国产在线精品成人一区二区三区| 黑人巨大精品欧美一区二区一视频| 国产成人啪精品视频免费网| 国产香蕉一区二区三区在线视频| www.日韩不卡电影av| 亚洲午夜精品久久久久久性色| 亚洲摸下面视频| 国产大片精品免费永久看nba|