国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Redis數(shù)據(jù)結(jié)構(gòu)之簡單動態(tài)字符串SDS

存儲 存儲軟件 Redis
Redis的底層數(shù)據(jù)結(jié)構(gòu)非常多,其中包括SDS、ZipList、SkipList、LinkedList、HashTable、Intset等。如果你對Redis的理解還只停留在get、set的水平的話,是遠遠不足以應(yīng)對面試提問的。本文簡單介紹了Redis底層最重要的數(shù)據(jù)結(jié)構(gòu) - 簡單動態(tài)字符串(SDS)。

 Redis的底層數(shù)據(jù)結(jié)構(gòu)非常多,其中包括SDS、ZipList、SkipList、LinkedList、HashTable、Intset等。如果你對Redis的理解還只停留在get、set的水平的話,是遠遠不足以應(yīng)對面試提問的。本文簡單介紹了Redis底層最重要的數(shù)據(jù)結(jié)構(gòu) - 簡單動態(tài)字符串(SDS)。

[[258985]]

Redis使用C語言開發(fā),但并沒有使用C語言傳統(tǒng)的字符串表示(以空字符結(jié)尾的字節(jié)數(shù)組,以下簡稱C字符串),而是自己構(gòu)建了一種名為簡單動態(tài)字符串的(simple dynamic string,SDS)的抽象類型,并將SDS用作Redis的默認(rèn)字符串表示。

在Redis里面,C字符串只會作為字符串字面量(static literal)用在一些無須對字符串值進行修改的地方。當(dāng)Redis需要的不僅僅是一個字符串字面量,而是一個可以被修改的字符串值時,Redis就會使用SDS來表示字符串值,比如在Redis的數(shù)據(jù)庫里面,包含字符串的鍵值對在底層都是由SDS實現(xiàn)的。

咱們來舉個例子,如果在客戶端執(zhí)行命令:

  1. redis> SET msg "hello world" 
  2. ok 

那么Redis將在數(shù)據(jù)庫中創(chuàng)建一個新的鍵值對,其中:

鍵值對的鍵是一個字符串對象,對象的底層實現(xiàn)是一個保存著字符串“msg”的SDS。

鍵值對的值也是一個字符串對象,對象的底層實現(xiàn)是一個保存著字符串“hello world”的SDS。

除了用來保存數(shù)據(jù)庫中的字符串值之外,SDS還被用作緩沖區(qū):AOF模塊中的AOF緩沖區(qū),以及客戶端狀態(tài)中的輸入緩沖區(qū),都是由SDS實現(xiàn)的。總之,SDS是Redis的最基礎(chǔ)也是最重要的數(shù)據(jù)結(jié)構(gòu)。

1.SDS的定義

每個 sds.h/sdshdr 結(jié)構(gòu)表示一個SDS值:

  1. struct sdshdr{ 
  2.     // 記錄buf數(shù)組中已使用字節(jié)的數(shù)量 
  3.     // 等于SDS所保存字符串的長度 
  4.     int len; 
  5.      
  6.     // 記錄buf數(shù)組中未使用字節(jié)的數(shù)量 
  7.     int free
  8.     //字節(jié)數(shù)組,用于保存字符串 
  9.     char buf[]; 

 

用一張圖來表示:

 

SDS 遵循 C 字符串以空字符結(jié)尾的慣例, 保存空字符的 1字節(jié)空間不計算在 SDS 的 len 屬性里面, 并且為空字符分配額外的 1 字節(jié)空間, 以及添加空字符到字符串末尾等操作都是由 SDS 函數(shù)自動完成的, 所以這個空字符對于 SDS 的使用者來說是完全透明的。

2.SDS與C字符串的區(qū)別

現(xiàn)在來說,C語言使用長度為N+1的字符數(shù)組來表示長度為N的字符串,并且字符數(shù)組的***一個元素總是空字符“”。

C的這種簡單的字符串表達方式,并不能滿足Redis對字符串在安全性、效率以及功能方面的要求。具體有以下幾個方面。

2.1 常數(shù)復(fù)雜度獲取字符串長度

因為C字符串并不記錄字符串的長度信息,所以為了獲取一個C字符串的長度,程序必須遍歷整個字符串,對遇到的每個字符進行計數(shù),直到遇到空字符為止,這個操作的復(fù)雜度為O(n)。而在Redis的SDS中,這個時間復(fù)雜度只有O(1)。

2.2 杜絕緩沖區(qū)溢出

除了獲取字符串長度的復(fù)雜度高之外,C字符不記錄自身長度帶來的另一個問題就是緩沖區(qū)溢出。舉個例子,C語言的 strcat 函數(shù)可以將字符串中的內(nèi)容拼接到 dest 字符串的末尾,但是當(dāng)字符串的容量不夠就會產(chǎn)生緩存區(qū)溢出,因為字符串也是基于數(shù)組實現(xiàn)的,也是有大小限制的。

Redis的SDS已經(jīng)杜絕了這個問題,那它是如何解決的呢?

當(dāng)API要對SDS進行修改時,API會先檢查SDS的空間是否滿足修改所需的空間,如果不夠的話,API會自動將SDS的空間進行擴容,然后才執(zhí)行實際的修改操作。這就避免了緩沖區(qū)內(nèi)存溢出。

2.3 減少修改字符串時帶來的內(nèi)存重分配次數(shù)

上面說到了API會在修改SDS字符串時自動擴容,如果每次修改都伴隨著對字符串內(nèi)的數(shù)組的內(nèi)存重分配,那效率可想而知。所以Redis實現(xiàn)了空間預(yù)分配和惰性空間釋放兩種優(yōu)化策略。

空間預(yù)分配

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

總的來說,額外分配的未使用空間數(shù)量大小有兩種可能:

如果對SDS修改之后,SDS的長度將小于1MB,那么程序分配和len 屬性同樣大小的未使用空間,這時候SDS的 free 屬性的值將和 len 屬性的值相同。也就是說,該SDS字符串修改完后還有近一半的容量。

如果對SDS修改之后,SDS的長度大于等于1MB,那么程序會分配1MB的未使用空間。這個是固定的。

通過空間預(yù)分配,Redis可以減少連續(xù)執(zhí)行字符串操作所需的內(nèi)存重分配次數(shù)。

惰性空間釋放

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

2.4 二進制安全

在C語言中,字符串的存儲必須符合某種編碼(ASCII),并且字符串不能包含空字符,否則會被認(rèn)為是字符串結(jié)尾。這些限制使得C字符串只能保存文本數(shù)據(jù),而不能保存像圖片、音頻、視頻、壓縮文件這樣的二進制數(shù)據(jù)。

所以,為了解決C字符串的不足,Redis的 buf 數(shù)組保存的是二進制數(shù)據(jù),這也就是把SDS的 buf 數(shù)組稱為字節(jié)數(shù)組的原因。

2.5 兼容部分C字符串函數(shù)

雖然 Redis 的API都是二進制安全的,但它們一樣遵循C字符串以空字符串結(jié)尾的慣例,這些API總會將SDS保存的數(shù)據(jù)的末尾設(shè)置為空字符,并且總會在為 buf 數(shù)組分配空間時多分配一個字節(jié)來容納這個空字符,這是為了讓那些保存文本數(shù)據(jù)的SDS可以重用一部分C的函數(shù)。

舉個例子, 如果我們有一個 SDS 的指針 s , 那么我們可以直接使用 stdio.h/printf 函數(shù), 通過執(zhí)行以下語句:

  1. printf("%s", s->buf); 

來打印出 SDS 保存的字符串值 "Redis" , 而無須為 SDS 編寫專門的打印函數(shù)。

責(zé)任編輯:武曉燕 來源: 博客園
相關(guān)推薦

2020-06-29 07:44:36

Redis

2021-12-21 11:39:01

數(shù)據(jù)結(jié)構(gòu)算法同構(gòu)字符串

2023-10-19 15:11:48

Redis

2022-02-10 09:04:18

RediSDS數(shù)據(jù)結(jié)構(gòu)

2023-03-28 07:44:23

數(shù)據(jù)結(jié)構(gòu)數(shù)組

2021-12-24 11:59:47

數(shù)據(jù)結(jié)構(gòu)算法字符串

2020-07-07 07:34:29

RedisSDS數(shù)據(jù)結(jié)構(gòu)

2020-05-13 12:17:33

RedisC字符C語言

2024-02-20 20:12:09

C語言字符串Redis

2021-02-18 07:45:09

redis 字符串SDS

2021-04-27 10:53:58

Redis數(shù)據(jù)庫SDS

2021-02-23 09:35:33

redis字符串數(shù)據(jù)庫

2025-08-26 02:15:00

Redis字符串)SDS

2021-12-23 14:09:43

數(shù)據(jù)結(jié)構(gòu)算法字符串

2023-01-09 08:42:04

String數(shù)據(jù)類型

2023-11-12 21:49:10

Redis數(shù)據(jù)庫

2021-12-27 11:30:51

數(shù)據(jù)結(jié)構(gòu)算法動態(tài)規(guī)劃

2021-07-16 07:57:34

Python數(shù)據(jù)結(jié)構(gòu)

2009-08-26 13:24:54

C#字符串

2020-12-16 07:36:46

Redis字符串數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號

国产精品又粗又长| 91精品久久久久久综合五月天 | 99re在线| 亚洲一区观看| 亚洲自拍三区| 99re8在线精品视频免费播放| 色综合手机在线| 亚洲一区在线免费观看| 成年人在线观看网站| 亚洲高清免费观看高清完整版| 台湾佬成人网| 久久久久久久av| 日韩激情图片| 日韩高清专区| 2014亚洲片线观看视频免费| 一个人看的免费网站www视频| 欧美理论片在线| 九九热这里有精品| 国产精品一区二区三区久久久| 亚洲精品韩国| 日韩中文字幕三区| 黑人精品xxx一区一二区| 国产天堂在线播放视频| 色综合色综合久久综合频道88| 五月久久久综合一区二区小说| 亚洲三区在线| 亚洲欧美成人一区二区三区| 在线欧美三级| 欧美激情区在线播放| 很黄很黄激情成人| 国产aaa免费视频| 黑人巨大精品欧美一区二区三区 | 国产伦理久久久久久妇女| 99re视频在线| 国产宾馆实践打屁股91| 爆操欧美孕妇| 亚洲精品一区二区精华| 另类春色校园亚洲| 女同一区二区| 亚洲欧美在线另类| 久久久久黄久久免费漫画| 久99九色视频在线观看| 亚洲精品欧洲| 国产视频1区2区3区| 日韩一区二区视频| 在线日韩网站| 国产精品久久久久9999爆乳| 色婷婷综合久久久| 精品国产第一国产综合精品| 精品乱子伦一区二区三区| 久久免费视频色| 亚洲精品一区二区三区婷婷月| 精品视频免费| 国产精品又粗又长| 欧美日韩免费高清一区色橹橹| 中文无码日韩欧| 无码免费一区二区三区免费播放 | 成人在线中文字幕| k8久久久一区二区三区| 久热av在线| 国内精品免费午夜毛片| 美美哒免费高清在线观看视频一区二区 | 香蕉视频在线观看网站| 在线中文字幕日韩| 午夜一级在线看亚洲| 精精国产xxxx视频在线动漫| 亚洲精品久久久一区二区三区| 偷拍欧美精品| 国语对白在线视频| 在线播放日韩精品| 日本少妇一区二区| 黄色小视频在线观看| 茄子视频成人在线| 久久久久久久综合| 午夜av成人| 亚洲精品成人三区| 欧美裸体一区二区三区| 在线观看免费一区二区| 黄页视频在线免费观看| 国内精品一区二区三区四区| 国产高清不卡二三区| 福利小视频在线| 久久人人九九| 欧美日韩久久久| 正在播放日韩欧美一页 | 日韩一级大片在线观看| 午夜视频精品| 在线中文字幕av| 国产成人在线播放| 亚洲国产精品ⅴa在线观看| 韩国精品视频在线观看| 欧美a级免费视频| 日韩久久免费视频| 久久福利资源站| 大菠萝精品导航| 午夜精品区一区二区三| 欧美大片在线观看一区| 日本亚洲欧洲色α| 亚洲欧美日韩天堂一区二区| 91精品国产色综合久久ai换脸 | 麻豆一区一区三区四区| 99色在线观看| 国产高清免费在线| 国外成人免费在线播放| 欧美诱惑福利视频| 国产精品偷伦一区二区 | 激情欧美日韩一区| 一区二区三区四区精品视频| 色网站在线看| 亚洲都市激情| 国产小视频在线| 久草视频视频在线播放| 久久香蕉av| 91破解版在线观看| 国产精品s色| 国产九九精品| 国内不卡的二区三区中文字幕| 欧美va天堂在线| 99成人超碰| 亚洲看片一区| 精品亚洲国产成人av制服丝袜| 久久都是精品| 成人在线高清| 草草影院在线| 成人欧美大片| 成人免费黄色| 亚洲精选av| 欧美va天堂| 日本欧美加勒比视频| 99久久精品国产网站| 精品日韩中文字幕| 亚洲三级电影网站| 欧美精品一级二级三级| 91精品国产色综合久久不卡98口| 日韩中文字幕欧美| 国产免费一区二区三区在线能观看| 日本成人黄色网| 国产三级国产精品国产专区50| 理论片在线观看理伦片| 日本一区二区三不卡| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 亚洲午夜色婷婷在线| 成人免费观看男女羞羞视频| 色妞ww精品视频7777| 在线激情av| 亚洲欧美影院| 97久久精品人搡人人玩| 一本色道久久综合亚洲aⅴ蜜桃| 久久久久一区| 亚洲一区网址| www在线免费观看| 妺妺窝人体色777777| 成人午夜在线影院| 在线日韩日本国产亚洲| 黄色精品一区二区| 丁香婷婷综合色啪| 欧美大人香蕉在线| 成人女人免费毛片| 成a人v在线播放| 午夜精品一区二区在线观看的| 在线观看视频99| 夜夜揉揉日日人人青青一国产精品| 亚洲成人中文| 日本成人在线网站| 欧美孕妇性xxxⅹ精品hd| 国产一区二区三区在线免费| 国产精品偷伦视频免费观看国产| 亚洲精品一区二区三区99| 亚洲乱码精品一二三四区日韩在线| 久久中文在线| 夜夜春成人影院| jizzjizz中国精品麻豆| 成年人免费看的视频| 9999在线观看| 91手机在线视频| 久久久久久久香蕉网| 精品欧美一区二区三区精品久久| 亚洲日本va在线观看| 国产综合久久久久影院| 亚洲精品中文字幕乱码| 国产精品亚洲综合在线观看| 永久免费av片在线观看全网站| 日韩大片一区二区| 国产高清精品软男同| 亚洲字幕一区二区| 久久久久久久久久亚洲| 亚洲国产欧美一区| 在线中文字幕一区二区| 国产精品国产三级国产有无不卡| 九九在线精品视频| 91av精品| 全国精品免费看| 97人人做人人爽香蕉精品| 国内外激情在线| 国产va在线观看| jizzjizz国产精品喷水| 亚洲综合第一| 久久精品日产第一区二区三区精品版 | 美女喷白浆视频| 亚洲一区三区|