日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

牛逼!Redis 的字符串是这样实现的…

發布時間:2025/3/21 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛逼!Redis 的字符串是这样实现的… 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:小小木的博客

www.cnblogs.com/wyc1994666/p/10669212.html

之前本人在找工作面試時在Redis相關問題上可栽了跟頭。

在面試前按常規套路準備了一下,比如 Redis 的常用5種數據結構,Redis持久化策略,Redis實現分布式鎖,簡單發布訂閱等等都準備了,當時不知天高地厚以為十拿九穩了,可是萬萬沒想到我終究還是在Redis的被問的第一個問題上翻船了~~

面試官 :?看你簡歷上寫了熟悉常用數據結構,都有哪些說說
本人 :?常用有5種,string,list,set,zset,hash(內心很得意)

面試官 :?那你說說都用過哪些數據結構_ ?
本人 :?用的最多的是string,通常會把json字符串存進去_

面試官 :?那你知道Redis內部是怎么實現它的string的么?_ ?
本人 :?呃~,我了解Redis是用C語言寫的,至于具體實現就不清楚了~

到此一面卒~~~

有相同經歷的朋友么?


回去后惡補了一下Redis有關原理性的知識點,恰好最近在最總結面試經歷于是有了今天這篇文章。

本篇會講以下內容:

  • Redis字符串的實現

  • Redis字符串的性能優勢

Redis字符串的實現

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

Redis構建了一個叫做簡單動態字符串(Simple Dynamic String),簡稱SDS

1.SDS 代碼結構

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

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

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

2.SDS 動態擴展特點

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

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

  • 計算出大小是否足夠

  • 開辟空間至滿足所需大小

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

  • 看到這兒為止有沒有朋友覺得這個實現跟Java的列表List實現有點類似呢?看完后面的會覺得更像了。

    Redis字符串的性能優勢

    • 快速獲取字符串長度

    • 避免緩沖區溢出

    • 降低空間分配次數提升內存使用效率

    1.快速獲取字符串長度

    再看下上面的SDS結構體:

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

    由于在SDS里存了已使用字符長度len,所以當想獲取字符串長度時直接返回len即可,時間復雜度為O(1)。如果使用C語言的字符串的話它的字符串長度獲取函數時間復雜度為O(n),n為字符個數,因為他是從頭到尾(到空字符'\0')遍歷相加。

    2.避免緩沖區溢出

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

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

  • 計算出大小是否足夠

  • 開辟空間至滿足所需大小

  • 3.降低空間分配次數提升內存使用效率

    字符串的追加操作會涉及到內存分配問題,然而內存分配問題會牽扯內存劃分算法以及系統調用,如果頻繁發生的話會影響性能,所以對于性能至上的Redis來說這是萬萬不能忍受的。推薦:Redis 內存滿了怎么辦?

    所以采取了以下兩種優化措施

    • 空間預分配

    • 惰性空間回收

    1. 空間預分配

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

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

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

    有了這個預分配策略之后會減少內存分配次數,因為分配之前會檢查已有的free空間是否夠,如果夠則不開辟了~

    2. 惰性空間回收

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

    到此為止結束了~

    下次在遇到這個問題可以侃侃而談了,哈哈哈~

    總結

    以上是生活随笔為你收集整理的牛逼!Redis 的字符串是这样实现的…的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 黄色激情视频网站 | 亚洲精品久久久狠狠狠爱 | 91成人在线播放 | 99热这里精品 | 亚洲电影一区二区三区 | 欧美在线二区 | 美女露隐私网站 | 阿娇全套94张未删图久久 | 给我免费观看片在线电影的 | 大桥未久av一区二区三区中文 | 自拍偷拍另类 | 精品日本一区二区 | 国产手机av | 日韩在线视频免费 | 向日葵视频在线播放 | 91亚洲国产精品 | 精品国产乱码久久 | 九九热视频在线 | 久久爱成人 | 国产欧美在线精品日韩 | 精品人妻一区二区三区免费看 | 奇米综合网 | 草久久免费视频 | 日本少妇xxxxxx | 黄色亚洲网站 | 国产欧美自拍 | 日韩avwww | 天堂√8在线中文 | 亚洲国产精品免费在线观看 | 国产剧情av麻豆香蕉精品 | 一道本一区二区 | 天天想你在线观看完整版高清 | 亚洲成人诱惑 | 日本黄色一级视频 | 国产激情视频网站 | 波多野吉衣视频在线观看 | 2019中文字幕在线视频 | 五月天在线观看 | 一区二区三区四区亚洲 | 亚洲天堂一区在线观看 | 人成免费 | 在线视频一区二区三区四区 | 三级全黄做爰在线观看 | 老牛影视少妇在线观看 | 日本无遮羞调教打屁股网站 | 青娱乐超碰在线 | 欧美xxxxx精品 | 久热免费| 在线成人播放 | 婷婷五月综合久久中文字幕 | 亚洲不卡在线观看 | 国产午夜手机精彩视频 | a猛片免费播放 | 男人的天堂网在线 | 欧洲高潮三级做爰 | 亚洲av毛片基地 | 99亚洲视频| 青青草社区 | 少妇真人直播免费视频 | 韩国黄色精品 | 亚洲精品乱码久久久久久写真 | 久久国产一级 | 自拍视频在线播放 | 福利在线小视频 | 西欧毛片 | 中文字幕视频 | 色欧美88888久久久久久影院 | 麻豆国产91在线播放 | 国产v综合v亚洲欧美久久 | 日本一区二区三区免费电影 | 国产精品无码一区二区三区免费 | 亚洲AV成人无码精品久久盆瓶 | www.欧美视频 | 亚洲女同一区 | 日本污网站 | 天堂成人av | 色www亚洲国产阿娇yao | 日本国产一区二区 | 久插网| 国产精品 欧美 日韩 | 欧美日韩一区二区三区不卡 | 最好看的中文字幕国语电影mv | 国产亚洲精品久 | 久久久久中文字幕 | 在线视频欧美亚洲 | 久久一二| 殴美一级黄色片 | 日本色www | 久久久久久国产精品免费播放 | 不卡av在线免费观看 | 日本久久影视 | 91成人综合 | 小日子的在线观看免费第8集 | 日韩国产一区二区三区 | 老熟妇仑乱视频一区二区 | 免费看爱爱视频 | 国产精品久久久久毛片软件 | 九九久久久久 | 免费观看a视频 |