精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

阿里面試這樣問:Redis 為什么把簡單的字符串設計成 SDS?

存儲 存儲軟件 Redis
redis也支持使用C語言的傳統(tǒng)字符串,只不過會用在一些不需要對字符串修改的地方,比如靜態(tài)的字符輸出。

本文轉載自微信公眾號「程序員內點事」,作者程序員內點事。轉載本文請聯(lián)系程序員內點事公眾號。

2021開工第一天,就有小伙伴私信我,還給我分享了一道他面阿里的redis題(這家伙絕比已經(jīng)拿到年終獎了),我看了以后覺得挺有意思,題目很簡單,是那種典型的似懂非懂,常常容易被大家忽略的問題。這里整理出來分享一下,順便自己鞏固一下基礎,希望對正在面試和想要面試的兄弟有點幫助。

題目大致是這樣的

面試官:了解redis的String數(shù)據(jù)結構底層實現(xiàn)嘛?

鐵子:當然知道,是基于SDS實現(xiàn)的

面試官:redis是用C語言開發(fā)的,那為啥不直接用C的字符串,還單獨設計SDS這樣的結構呢?

鐵子:·····

 

“其實看得出面試官是想看看,鐵子是只停留在redis的使用層面,還是對底層數(shù)據(jù)結構有過更深入的研究,面試嘛都愛這樣問大家都懂得。我們知道redis是用C寫的,但它卻沒有完全直接使用C的字符串,而是自己又重新構建了一個叫簡單動態(tài)字符串SDS(simple dynamic string)的抽象類型。

redis也支持使用C語言的傳統(tǒng)字符串,只不過會用在一些不需要對字符串修改的地方,比如靜態(tài)的字符輸出。

而我們開發(fā)中使用redis,往往會經(jīng)常性的修改字符串的值,這個時候就會用SDS來表示字符串的值了。有一點值得注意:在redis數(shù)據(jù)庫中,key-value鍵值對含有字符串值的,都是由SDS來實現(xiàn)的。

比如:在redis執(zhí)行一個最簡單的set命令,這時redis會新建一個鍵值對。

  1. 127.0.0.1:6379> set xiaofu "程序員內點事" 

此時鍵值對的key和value都是一個字符串對象,而對象的底層實現(xiàn)分別是兩個保存著字符串xiaofu和程序員內點事的SDS結構。

再比如:我向一個列表中壓入數(shù)據(jù),redis 又會新建一個鍵值對。

  1. 127.0.0.1:6379> lpush xiaofu "程序員內點事" "程序員小富" 

這時候鍵值對的鍵和上邊一樣,還是一個由SDS實現(xiàn)的字符串對象,鍵值對的值是一個包含兩個字符串對象的列表對象了,而這兩個對象的底層也是由SDS實現(xiàn)。

SDS結構

一個SDS值的數(shù)據(jù)結構,主要由len、free、buf[]這三個屬性組成。

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

其中buf[]為實際保存字符串的char類型數(shù)組;free表示buf[]數(shù)組未使用字節(jié)的數(shù)量;len表示buf[]數(shù)組所保存的字符串的長度。

 

例如上圖表示的是buf[]保存長度為6個字節(jié)的字符串,未使用的字節(jié)數(shù)free為0,但是眼尖的同學會發(fā)現(xiàn)這明明是7個字符,還有一個"\0"啊?

上邊提到過SDS沒有完全直接使用C的字符串,還是沿用了一些C特性的,比如遵循C的字符串以空格符結尾的規(guī)則,這樣還可以使用一部分C字符串的函數(shù)。而對于SDS來說,空字符串占用的一字節(jié)是不計算在len屬性里的,會為他分配額外的空間。

簡單了解SDS結構后,下邊我們來看看SDS相比于C字符串有哪些優(yōu)點。

效率高

舉個例子:工作中使用redis,經(jīng)常會通過STRLEN命令得到一個字符串的長度,在SDS結構中l(wèi)en屬性記錄了字符串的長度,所以我們獲取一個字符串長度直接取len的值,復雜度是O(1)。

 

而如果用C字符串,在獲取一個字符串長度時,需對整個字符串進行遍歷,直至遍歷到空格符結束(C中遇到空格符代表一個完整字符串),此時的復雜度是O(N)。

在高并發(fā)場景下頻繁遍歷字符串,獲取字符串的長度很有可能成為redis的性能瓶頸,所以SDS性能更好一些。

數(shù)據(jù)溢出

上邊提到C字符串是不記錄自身長度的,相鄰的兩個字符串存儲的方式可能如下圖,為字符串分配了合適的內存空間。

 

如果此時我想把“程序員內點事”改成“程序員內點事123”,可之前分配的內存只有6個字節(jié),修改后的字符串需要9個字節(jié)才能放下啊,怎么搞?

 

沒辦法只能侵占相鄰字符串的空間,自身數(shù)據(jù)溢出導致其他字符串的內容被修改。

而SDS很好的規(guī)避了這點,當我們需要修改數(shù)據(jù)時,首先會檢查當前SDS空間len是否滿足,不滿足則自動擴容空間至修改所需的大小,然后再執(zhí)行修改,如下圖所示。

 

不過有個特殊的地方,在把“程序員內點事”的6個字節(jié)擴容到“程序員內點事123”9個字節(jié)后,發(fā)現(xiàn)free屬性的值變成了擴容后字符串的總長度,這就涉及到下邊要說的內存重分配策略了。

內存重分配策略

C字符串長度是一定的,所以每次在增長或者縮短字符串時,都要做內存的重分配,而內存重分配算法通常又是一個比較耗時的操作,如果程序不經(jīng)常修改字符串還是可以接受的。

但很不幸,redis作為一個數(shù)據(jù)庫,數(shù)據(jù)肯定會被頻繁修改,如果每次修改都要執(zhí)行一次內存重分配,那么就會嚴重影響性能。

SDS通過兩種內存重分配策略,很好的解決了字符串在增長和縮短時的內存分配問題。

1.空間預分配

空間預分配策略用于優(yōu)化SDS字符串增長操作,當修改字符串并需對SDS的空間進行擴展時,不僅會為SDS分配修改所必要的空間,還會為SDS分配額外的未使用空間free,下次再修改就先檢查未使用空間free是否滿足,滿足則不用在擴展空間。

通過空間預分配策略,redis可以有效的減少字符串連續(xù)增長操作,所產(chǎn)生的內存重分配次數(shù)。

 

額外分配未使用空間free的規(guī)則:

  • 如果對 SDS 字符串修改后,len 值小于 1M,那么此時額外分配未使用空間 free 的大小與len相等。
  • 如果對 SDS 字符串修改后,len 值大于等于 1M,那么此時額外分配未使用空間 free 的大小為1M。

2.惰性空間釋放

惰性空間釋放策略則用于優(yōu)化SDS字符串縮短操作,當縮短SDS字符串后,并不會立即執(zhí)行內存重分配來回收多余的空間,而是用free屬性將這些空間記錄下來,如果后續(xù)有增長操作,則可直接使用。

 

數(shù)據(jù)格式多樣性

C字符串中的字符必須符合某些特定的編碼格式,而且上邊我們也提到,C字符串以\0空字符結尾標識一個字符串結束,所以字符串里邊是不能包含\0的,不然就會被誤認是多個。

由于這種限制,使得C字符串只能保存文本數(shù)據(jù),像音視頻、圖片等二進制格式的數(shù)據(jù)是無法存儲的。

redis 會以處理二進制的方式操作Buf數(shù)組中的數(shù)據(jù),所以對存入其中的數(shù)據(jù)未做任何的限制、過濾,只要存進來什么樣,取出來還是什么樣。

總結

上邊只是 redis 數(shù)據(jù)結構的一點基礎知識,沒什么難度,但以我的面試經(jīng)驗,如果被問這類問題,不要只含糊其辭的說出底層是SDS,有理有據(jù)的把為什么這樣實現(xiàn)也說出來。

 

一來可以顯得自己基本功扎實,如果表達的在條理清晰,是個很不錯的加分項;在一個主動打消面試官問下去的念頭,當然就怕不按套路出牌的人!

 

責任編輯:武曉燕 來源: 程序員內點事
相關推薦

2021-04-27 10:53:58

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

2021-02-23 09:35:33

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

2019-03-07 15:43:22

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

2021-02-07 21:16:04

字節(jié)跳動面試字符串

2020-05-13 12:17:33

RedisC字符C語言

2024-02-20 20:12:09

C語言字符串Redis

2020-07-23 16:00:38

Redis字符串Java

2024-05-27 08:04:41

2023-03-21 15:27:00

RedisC語言字符串

2024-05-27 08:01:15

2023-01-03 08:07:33

Go字符串指針

2023-09-21 10:50:23

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

2015-03-19 15:04:06

2023-05-29 08:03:41

代碼Go語言

2019-02-27 09:00:13

阿里巴巴for循環(huán)Java

2019-01-29 10:30:32

阿里巴巴Java字符串

2025-06-16 08:10:00

2025-06-11 08:35:00

數(shù)據(jù)倉庫數(shù)倉分層架構

2021-02-02 18:03:00

字符串面試官子序列

2020-12-16 07:36:46

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

51CTO技術棧公眾號

国产精品igao| 国产精品久久亚洲| 5566中文字幕| 日韩精品亚洲专区在线观看| 亚洲福利视频一区二区| 欧美1o一11sex性hdhd| 中文字幕日本人妻久久久免费| 97精品国产一区二区三区| 日韩精品一区二区三区四区 | 国产福利在线看| 另类小说欧美激情| 国内精品一区二区三区| 国产破处视频在线观看| caoporn成人| 久久午夜激情| 另类天堂视频在线观看| 手机在线成人av| 亚洲tv在线| 欧美日韩中文字幕在线| av电影一区二区三区| 五月激情六月婷婷| 国产一区日韩二区欧美三区| 欧洲日本亚洲国产区| 欧美性猛交xxxxx少妇| 免费一区二区三区视频导航| 日韩午夜激情av| 国产激情在线观看视频| 福利小视频在线| 国产网红主播福利一区二区| 成人免费看片网址| 一区二区三区精彩视频| 久久精品在线| 2021国产精品视频| 免费在线观看黄色av| 日韩欧美1区| 亚洲视频国产视频| 中文字幕免费在线播放| 日韩一区二区三区高清在线观看| 欧美无砖专区一中文字| 日韩少妇内射免费播放| heyzo一区| 亚洲一区在线观看视频| 91影视免费在线观看| 99自拍偷拍视频| 欧美一区二区三区红桃小说| 欧美一级爆毛片| 亚洲一区二区福利视频| 深夜视频一区二区| 色综合一区二区三区| 欧美三级在线观看视频| 里番在线播放| 亚洲成人免费在线观看| 日本天堂免费a| 亚洲无线看天堂av| 亚洲免费观看视频| 国产资源第一页| 欧美一区二区三区黄片| 久久99精品久久久久久动态图| 国产精品成人在线| 久久影视中文字幕| 青草国产精品久久久久久| 国产成人精彩在线视频九色| 欧美超碰在线观看| 日韩成人免费在线| 国产精品视频导航| 911美女片黄在线观看游戏| 麻豆传媒一区二区三区| 国产日韩在线一区| 国产乱叫456在线| 国产精品69毛片高清亚洲| 亚洲综合日韩中文字幕v在线| 国产白浆在线观看| 成人黄色小视频在线观看| 国产亚洲二区| 国产在线色视频| 亚洲欧洲日韩一区二区三区| 91沈先生播放一区二区| av手机免费看| 不卡一区在线观看| 欧美一区1区三区3区公司| 国产有码在线| 亚洲精品一卡二卡| 免费看国产曰批40分钟| 日本免费久久| 一区二区三区在线观看动漫| 日本人妻伦在线中文字幕| 超碰97免费在线| 色天使色偷偷av一区二区| 亚洲黄色av网址| 黄页网站大全在线免费观看| 狠狠躁天天躁日日躁欧美| 农村妇女精品一二区| 欧美日韩国产成人| 亚洲欧洲制服丝袜| 午夜精品一区二区在线观看| 免费观看在线午夜影视| 亚洲精品视频在线看| 国产成a人亚洲精v品在线观看| 亚洲欧美高清在线| 久久国际精品| 亚洲国产精品美女| 国产又粗又黄又猛| 午夜精品影院| 国产aⅴ夜夜欢一区二区三区| 一级片视频播放| 99久久精品国产精品久久| 色综合久久久久久久久五月| 欧美6一10sex性hd| 欧美日韩一本到| 少妇一级淫片免费放播放| 日韩在线视屏| 欧美一区视频在线| www日本视频| 中文字幕精品三区| 激情伊人五月天| 国产精品亚洲欧美日韩一区在线| 亚洲毛片在线观看| 免费无遮挡无码永久在线观看视频| 水野朝阳av一区二区三区| 97夜夜澡人人双人人人喊| 搞黄视频免费在线观看| 精品国产乱码久久久久久天美| 五月六月丁香婷婷| 成人看的视频| 日产日韩在线亚洲欧美| 黄色aaa大片| 亚洲欧洲综合另类在线| 国产九九热视频| 精品在线观看入口| 午夜精品福利电影| www.国产精品视频| 亚洲日本欧美天堂| 青青草精品视频在线观看| 久久97久久97精品免视看秋霞| 制服视频三区第一页精品| 色天使在线视频| 西野翔中文久久精品字幕| 久久亚洲精品毛片| 在线观看免费视频一区| 久久日一线二线三线suv| 免费看欧美黑人毛片| 综合久草视频| 精品久久国产字幕高潮| 亚洲女人久久久| 美女在线一区二区| 日本一区二区三区免费看| 日本免费一区二区六区| 亚洲国产精品va在线| 黄色一级免费视频| 国产成人免费视| 青青在线视频免费观看| 国产日韩欧美中文在线| 久久精品成人欧美大片古装| 一级全黄少妇性色生活片| 亚洲国产精品成人久久综合一区| 成年人在线看片| 精品99久久| 国产精品视频免费在线观看| 成人高潮成人免费观看| 亚洲少妇中出一区| 青青草久久伊人| 91精品国产自产拍在线观看蜜| 国产自摸综合网| 高清免费电影在线观看| 欧美一区三区四区| 久久久久性色av无码一区二区| 国产99久久久久| 欧美 日韩 国产 高清| 天堂99x99es久久精品免费| 日本成人激情视频| 北条麻妃在线| 制服丝袜亚洲播放| 精品无码人妻一区二区三区| 99久久久国产精品| 粉嫩虎白女毛片人体| 99久精品视频在线观看视频| 欧美激情精品久久久久| 亚洲黄网在线观看| 国产精品网站一区| 国产欧美激情视频| 欧美激情亚洲| 久久久久久久久久久久久久一区 | 精品一区二区av| 国产欧美欧洲| 网友自拍亚洲| 久久久久999| 视频国产一区二区三区| 自拍偷拍亚洲激情| 影音先锋资源av| 视频一区在线视频| 公共露出暴露狂另类av| 都市激情亚洲欧美| 国产精品毛片a∨一区二区三区|国| av毛片在线看| 亚洲人成网7777777国产| 国产露脸国语对白在线| 欧美日韩美女在线| 久久久久久久麻豆| 91免费视频网| 丝袜人妻一区二区三区| 国产欧美日韩视频在线| 91久久嫩草影院一区二区| 精精国产xxxx视频在线播放| 中文字幕一区二区精品| 欧日韩在线视频| 欧美日韩色一区| 亚洲 欧美 日韩 综合| 亚洲欧洲日本在线| 黄瓜视频污在线观看| 国产自产v一区二区三区c| 97国产精东麻豆人妻电影| 一区二区三区四区日韩| 日本免费高清不卡| 久久成人福利| 99精品国产一区二区| 全球最大av网站久久| 国语自产精品视频在线看抢先版图片| 在线免费观看黄色网址| 亚洲欧美另类在线观看| 蜜桃91麻豆精品一二三区| 欧美日韩亚洲国产综合| 99久久久无码国产精品免费蜜柚 | 热久久最新地址| 日韩av有码| 日韩电影大全在线观看| 国产伦理久久久久久妇女| 91久久国产精品| 开心久久婷婷综合中文字幕| 国产成人精品日本亚洲专区61| 岛国av免费在线观看| 欧美老少做受xxxx高潮| 黄色片免费在线观看| 自拍偷拍亚洲在线| 国产在线电影| 一本色道久久88综合亚洲精品ⅰ| 日本一区二区三区在线观看视频| 欧美mv日韩mv亚洲| 国产福利小视频| 欧美一区二区三区在线观看| 亚洲天堂网在线视频| 欧美最新大片在线看| 亚洲最大成人综合网| av电影在线观看完整版一区二区| 不卡的一区二区| 国产精品1区二区.| 无套白嫩进入乌克兰美女| 国产一区二区三区在线观看免费视频| 亚洲一区日韩精品| 久久草av在线| 亚洲综合20p| 国产精品1区2区3区在线观看| xxx中文字幕| 国产精品 欧美精品| 中文字幕制服丝袜| 国产suv精品一区二区6| 99免费观看视频| 99精品欧美一区二区三区小说 | 不卡日本视频| 亚洲欧洲精品一区| 国产精品99久久| 精品国产一区二区三区在线| 欧美精品97| 男人插女人视频在线观看| 狠狠入ady亚洲精品| 亚洲一区二区三区av无码| 亚洲精品人人| 男人天堂成人在线| 久久99在线观看| 又黄又色的网站| 91亚洲男人天堂| 国产一区二区三区精品在线| 中文字幕一区二区在线播放| 国产探花在线免费观看| 亚洲午夜免费电影| 久久国产乱子伦精品| 欧美乱妇20p| 欧美一级视频免费| 亚洲精品一区中文字幕乱码| 第三区美女视频在线| 欧美尺度大的性做爰视频| 成人免费观看在线观看| 国产精品高潮呻吟久久av无限| 午夜精品久久久久久毛片| 国产91一区二区三区| 国产精品密蕾丝视频下载| 欧美 日韩 国产 在线观看| 欧美a一欧美| 午夜精品视频在线观看一区二区 | 久久久久久影视| 成人一级黄色大片| 午夜精品福利一区二区三区av| 中文字幕永久在线| 欧美成人vr18sexvr| 国产一区精品| 九色91av视频| 最新日韩一区| 国产一区二区免费在线观看| 成人看的视频| 欧美国产亚洲一区| 国产专区综合网| 成人片黄网站色大片免费毛片| 亚洲精品视频免费观看| 五月天婷婷导航| 欧美xxxxxxxxx| 91caoporm在线视频| 久久免费视频在线| 国产999精品在线观看| 欧美一区二区三区精美影视| 欧美日韩一区二区高清| 亚洲天堂2018av| 久久蜜桃一区二区| 国产亚洲精品久久777777| 欧美在线你懂得| 视频午夜在线| 久久免费视频在线观看| 精品久久国产一区| 亚洲国产精品综合| 亚洲欧美成人| 午夜av免费看| 一区二区三区在线高清| 亚洲系列第一页| 夜夜嗨av色综合久久久综合网| 9999热视频在线观看| 91黄在线观看| 久久精品国产大片免费观看| 天天影视综合色| 久久精品亚洲精品国产欧美| 日韩欧美一区二区一幕| 日韩精品中文字幕一区二区三区| 免费黄色在线| 成人福利在线视频| 日本精品三区| 91小视频网站| 欧美激情在线免费观看| 四虎成人免费影院| 欧美性xxxxx极品| 亚洲人成色777777精品音频| 欧美激情国产日韩精品一区18| 麻豆一二三区精品蜜桃| 在线观看精品视频| 久久国产精品99精品国产| 快灬快灬一下爽蜜桃在线观看| 欧美性xxxxx极品| 国产中文字幕在线观看| 日本久久久久久| 久久av影视| 欧美一级黄色影院| 欧美极品aⅴ影院| 一区二区三区亚洲视频| zzijzzij亚洲日本成熟少妇| 欧美成a人片免费观看久久五月天| 亚洲精品一区二区三| 美国毛片一区二区| 波多野结衣久久久久| 91精品婷婷国产综合久久| 国产福利视频在线观看| 亚洲a区在线视频| 国产精品a久久久久| 中文字幕一区二区人妻电影丶| 欧美性猛xxx| avtt亚洲| 99re视频在线播放| 亚洲大片av| 国产美女喷水视频| 日本高清不卡视频| 黄色在线视频网站| 成人午夜影院在线观看| 夜夜嗨av一区二区三区网站四季av| 玖玖爱在线精品视频| 色综合久久久久久久久| 69视频在线观看| 99国产视频在线| 亚洲欧美日本国产专区一区| 东方伊人免费在线观看| 日韩一区和二区| 人人草在线视频| 一区二区三区四区欧美日韩| 国产高清不卡二三区| 日本一区二区三区四区五区| 欧美调教femdomvk| 黄色精品在线观看| 国产中文一区二区| 日本中文在线一区| 极品颜值美女露脸啪啪| 日韩精品视频在线播放| 精品福利在线| 97视频在线免费| 中文字幕精品一区二区精品绿巨人 | 男人舔女人下面高潮视频| 国产日韩一级二级三级| 国产毛片毛片毛片毛片| 韩国v欧美v日本v亚洲| 精品一区不卡| 国产艳妇疯狂做爰视频| 在线看一区二区| 女子免费在线观看视频www| 日韩av高清在线播放| 国产成人免费视频精品含羞草妖精| 午夜精品一区二| 欧美激情一区二区三区高清视频|