成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis面試都卷到C語言去了......

數據庫 Redis
不同于 C 中的字符串,SDS 可以存儲二進制數據,因為 SDS 不再通過 \0 去判斷字符串結束,因為有一個 len 變量存儲了字符串的長度。

Redis 面試都卷到 C 去了。有個小伙伴在前兩天找松哥模面的時候如是說到。

是啊,沒辦法,自從 Java 八股文這個概念被提出來并且逐步在 Java 程序員中強化之后,現在各種各樣的八股文手冊,有免費的有付費的,琳瑯滿目。

單純的八股文已經區分不出 Java 猿水平的高低了,所以現在面試總會卷出新高度。

這次是小伙伴面試時候被問到一個 SDS 的問題,也就是 Redis 中 String 字符串的底層實現原理。

我來和小伙伴們簡單聊一聊這個話題。

一 String 類型

Redis 中有一個 String 類型,使用頻率還比較高,我們日常做緩存、分布式鎖都會用到。

很多小伙伴也都知道 Redis 是用 C 寫的,那么就有一個問題,Redis 中的 String,底層數據結構是什么樣的?

是不是就是 C 中的 String 呢?

二 C 中的 String

玩過 C 的小伙伴應該知道,C 語言本身并沒有內置的 String 類型,但是 C 語言中可以使用字符數組(char array[])或指向字符的指針(char *pointer)來表示字符串。在 C 語言中,字符串是以空字符 '\0' 結尾的字符序列。例如:

char *str1 = "Hello, World!";

在這個例子中,str1 是一個指向字符串字面量 "Hello, World!" 的指針。

當我們在 Redis 中使用 String 的時候,很多小伙伴可能會想這個 String 可能就是 C 中的 String 吧?并不是!

為什么不直接使用 C 中的 String 呢?主要有以下幾種考慮:

  1. char* 這種方式無法直接獲取到字符串的長度,只能逐個字符去遍歷,很明顯效率低。
  2. C 中的字符串使用 \0 去表示字符串結束,這就導致我們沒法在字符串中存儲二進制數據,因為二進制中的數據可能會和 \0 沖突。
  3. C 中字符串在創建的時候長度和內存大小就都確定下來了,后期如果縮容和擴容都是創建新數組然后拷貝內容,操作方式過于麻煩。

有鑒于此,Redis 自己搞了個 SDS,全稱是 Simple Dynamic String。這個 SDS 和 C 中的字符串的關系,有點像我們 Java 中 List 和數組的關系,有點。

三 SDS

為了解決上述問題,小伙伴們可以先想想,我們都需要哪些東西呢?

  • 首先得有一個存儲字符的 char 數組吧。
  • 數組的總長度得有一個變量記錄下來吧。
  • 數組已經使用的長度得記錄下來吧。

這是三個最基本的屬性。

3.1 SDS 類型

當然在具體實踐中還有一個 flags 屬性,這個屬性用來表示 SDS 的類型,因為 Redis 設計了幾種不同的 SDS 類型,這樣的設計主要是為了節省內存。

圖片圖片

從這里可以看到,一共有五種不同的 SDS 類型,分別是:

  1. sdshdr5
  2. sdshdr8
  3. sdshdr16
  4. sdshdr32
  5. sdshdr64

從注釋中可以看到,sdshdr5 其實沒有使用,另外四個的區別主要在于數組長度和分配空間長度的差異。

以 sdshdr16 為例,uint16_t 表示 16 位無符號 int 值,能表示的最大值是 2^16-1,所以它的 buf 數組的最大長度就是 2^16。

按照這樣的設計,其實 Redis 的字符串能夠存儲超大的字符串,例如,sdshdr32 類型意味著能夠存儲的字符長度是 2^32,一個字符占一個字節,就是 4GB。

可是實際上 Redis 的字符串存不了這么長的,Redis 內部會對字符串的長度進行限制,最大是 512MB。

當然實際生產中我們不建議這么搞,一般字符串最好不要超過 1MB。

3.2 編碼格式

為了提升效率,SDS 中使用的編碼格式也會根據情況來定。

  • 如果是數字類型,且數字長度小于 20,就會使用 int 編碼。

圖片圖片

  • 長度小于等于 44 字節的字符串,使用 embstr 編碼。
  • 長度大于 44 字節的字符串使用 raw 編碼。

圖片圖片

3.3 其他特點

不同于 C 中的字符串,SDS 可以存儲二進制數據,因為 SDS 不再通過 \0 去判斷字符串結束,因為有一個 len 變量存儲了字符串的長度。

同時,SDS 在字符串擴容的時候也會進行預分配,這些機制類似于咱們 Java 中 ArrayList 擴容、HashMap 擴容,擴容時會預留空間,避免頻繁擴容。

同時,縮容的時候并不會立馬釋放多余空間,防止后續又要擴容。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2019-12-09 10:00:46

Python語言Java

2023-11-10 17:04:33

2020-03-27 16:27:03

Redis數據庫

2021-07-26 14:59:23

面試Redis內存數據庫

2010-01-21 16:08:26

C++語言

2019-07-03 14:47:43

程序員祼辭就業

2010-03-10 09:07:16

數據中心

2023-03-06 08:27:33

Redis數據類型

2017-11-08 11:13:14

大數據Spark數據傾斜

2023-01-04 11:04:32

2023-09-06 07:58:45

數據緩存Redis

2020-08-03 15:20:56

Redis數據庫命令

2023-09-25 09:27:31

編程語言可視化

2013-05-09 10:24:28

企業軟件軟件開發

2020-04-23 08:45:46

編程語言二進制

2023-01-01 14:22:17

2009-08-27 16:03:31

從c#到c++

2019-12-06 10:59:21

編程語言C語言開 發

2016-11-24 23:32:32

技術面試團隊協作解決問題

2021-11-12 10:05:19

跳表BAT面試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲九九色 | 欧美一级大片 | 亚洲一区在线播放 | 黄色大片毛片 | 亚洲久草 | 欧美999 | 国产精品mv在线观看 | 日本不卡一区 | 国产精品美女久久久 | 国产视频久久 | 国产精品久久亚洲7777 | 天天干天天玩天天操 | 69热视频在线观看 | 国产亚洲欧美日韩精品一区二区三区 | 日本一区二区高清不卡 | 精品欧美一区二区三区免费观看 | 精品欧美一区二区中文字幕视频 | www.久久99 | 国产精品无 | 在线免费中文字幕 | 久久精品亚洲一区二区三区浴池 | 国产极品91 | 性高湖久久久久久久久 | 久久久久av| 18成人在线观看 | 成人精品一区二区三区中文字幕 | 国产精品久久久久久久久久不蜜臀 | 天天干人人 | 精品久久久久久久久久久久久久 | 日韩免费一区 | www.99re5.com| 欧美日韩精品一区二区三区四区 | 久在线 | 精品国产一二三区 | 中文字幕亚洲一区二区va在线 | 人人鲁人人莫人人爱精品 | 污书屋| 亚洲欧美在线视频 | 日本午夜网站 | 免费观看黄色一级片 | 国产精品久久久久久久久久免费 |