欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Redis中怎么實(shí)現(xiàn)字符串

redis中怎么實(shí)現(xiàn)字符串,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了朗縣免費(fèi)建站歡迎大家使用!

Redis字符串的實(shí)現(xiàn)

Redis雖然是用C語言寫的,但卻沒有直接用C語言的字符串,而是自己實(shí)現(xiàn)了一套字符串。目的就是為了提升速度,提升性能,可以看出Redis為了高性能也是煞費(fèi)苦心。

Redis構(gòu)建了一個叫做簡單動態(tài)字符串(Simple Dynamic String),簡稱SDS

1.SDS 代碼結(jié)構(gòu)

struct sdshdr{  
    //  記錄已使用長度      int len;  
    // 記錄空閑未使用的長度      int free;  
    // 字符數(shù)組      char[] buf;  
};

SDS ?什么鬼?可能對此陌生的朋友對這個名稱有疑惑。只是個名詞而已不必在意,我們要重點(diǎn)欣賞借鑒Redis的設(shè)計思路。下面畫個圖來說明,一目了然。

Redis中怎么實(shí)現(xiàn)字符串

Redis的字符串也會遵守C語言的字符串的實(shí)現(xiàn)規(guī)則,即最后一個字符為空字符。然而這個空字符不會被計算在len里頭。

2.SDS 動態(tài)擴(kuò)展特點(diǎn)

SDS的最厲害最奇妙之處在于它的Dynamic。動態(tài)變化長度。舉個例子

Redis中怎么實(shí)現(xiàn)字符串

如上圖所示剛開始s1 只有5個空閑位子,后面需要追加' world' 6個字符,很明顯是不夠的。那咋辦?Redis會做以下三個操作:

  1. 計算出大小是否足夠

  2. 開辟空間至滿足所需大小

  3. 開辟與已使用大小len相同長度的空閑free空間(如果len < 1M)開辟1M長度的空閑free空間(如果len >= 1M)

看到這兒為止有沒有朋友覺得這個實(shí)現(xiàn)跟Java的列表List實(shí)現(xiàn)有點(diǎn)類似呢?看完后面的會覺得更像了。

Redis字符串的性能優(yōu)勢
  • 快速獲取字符串長度

  • 避免緩沖區(qū)溢出

  • 降低空間分配次數(shù)提升內(nèi)存使用效率

1.快速獲取字符串長度

再看下上面的SDS結(jié)構(gòu)體:

struct sdshdr{  
    //  記錄已使用長度      int len;  
    // 記錄空閑未使用的長度      int free;  
    // 字符數(shù)組      char[] buf;  
};

由于在SDS里存了已使用字符長度len,所以當(dāng)想獲取字符串長度時直接返回len即可,時間復(fù)雜度為O(1)。如果使用C語言的字符串的話它的字符串長度獲取函數(shù)時間復(fù)雜度為O(n),n為字符個數(shù),因?yàn)樗菑念^到尾(到空字符'\0')遍歷相加。

2.避免緩沖區(qū)溢出

對一個C語言字符串進(jìn)行strcat追加字符串的時候需要提前開辟需要的空間,如果不開辟空間的話可能會造成緩沖區(qū)溢出,而影響程序其他代碼。如下圖,有一個字符串s1="hello" 和 字符串s2="baby",現(xiàn)在要執(zhí)行strcat(s1,"world"),并且執(zhí)行前未給s1開辟空間,所以造成了緩沖區(qū)溢出。

Redis中怎么實(shí)現(xiàn)字符串

而對于Redis而言由于每次追加字符串時都會檢查空間是否夠用,所以不會存在緩沖區(qū)溢出問題。每次追加操作前都會做如下操作:

  1. 計算出大小是否足夠

  2. 開辟空間至滿足所需大小

3.降低空間分配次數(shù)提升內(nèi)存使用效率

字符串的追加操作會涉及到內(nèi)存分配問題,然而內(nèi)存分配問題會牽扯內(nèi)存劃分算法以及系統(tǒng)調(diào)用所以如果頻繁發(fā)生的話影響性能,所以對于性能至上的Redis來說這是萬萬不能忍受的。

所以采取了以下兩種優(yōu)化措施

  • 空間與分配

  • 惰性空間回收

1. 空間預(yù)分配

對于追加操作來說,Redis不僅會開辟空間至夠用而且還會預(yù)分配未使用的空間(free)來用于下一次操作。至于未使用的空間(free)的大小則由修改后的字符串長度決定。

當(dāng)修改后的字符串長度len < 1M,則會分配與len相同長度的未使用的空間(free)

當(dāng)修改后的字符串長度len >= 1M,則會分配1M長度的未使用的空間(free)

有了這個預(yù)分配策略之后會減少內(nèi)存分配次數(shù),因?yàn)榉峙渲皶z查已有的free空間是否夠,如果夠則不開辟了~

2. 惰性空間回收

與上面情況相反,惰性空間回收適用于字符串縮減操作。比如有個字符串s1="hello world",對s1進(jìn)行sdstrim(s1," world")操作,執(zhí)行完該操作之后Redis不會立即回收減少的部分,而是會分配給下一個需要內(nèi)存的程序。當(dāng)然,Redis也提供了回收內(nèi)存的api,可以自己手動調(diào)用來回收縮減部分的內(nèi)存。

關(guān)于Redis中怎么實(shí)現(xiàn)字符串問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

文章名稱:Redis中怎么實(shí)現(xiàn)字符串
文章分享:http://chinadenli.net/article16/ggjggg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計公司微信小程序電子商務(wù)定制網(wǎng)站虛擬主機(jī)網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化