在面試間里等候時,感覺這可真暖和呀,我那冰冷的出租屋還得蓋兩層被子才能睡著,正要把外套脫下來,我突然聽到了門外的腳步聲,隨即門被打開,穿著干凈滿臉清秀的青年走了進來,一股男士香水的淡香撲面而來,
面試官:Redis中基本的資料型別有哪些?
我:Redis的基本資料型別有:字串(string)、哈希(hash)、串列(list)、集合(set)、有序集合(zset),
面試官:字串型別的內部實作方式是什么?
我還沉浸在上一個問題的沾沾自喜中,頓時表情凝固了,手心開始冒出冷汗,“這個,,沒有太深入了解”,我支支吾吾的說到,
面試官:回去等訊息吧,
這句話說的干凈利落,然后就沒有然后了,失敗是成功的媽媽,我不氣餒,決定馬上惡補一下,
型別和編碼
首先,整明白什么是型別?什么是編碼?在Redis中使用物件來表示記憶體中的鍵和值,每個物件由一個叫做redisObject結構體表示,其中有三個屬性:型別(type)、編碼(encoding)、指向具體資料的指標(ptr),
我們通常說的字串、哈希、串列、集合、有序集合都是redisObject中的型別,實際上針對每一個資料結構在Redis內部都有自己底層的多種內部編碼實作,這樣是為了在合適的場景選擇合適的內部編碼,以達到記憶體空間和處理效率的平衡,這可能就是中庸之道吧,
在面試中,經常被問到的內部實作方式、內部構造、內部原理,一般指的就是redisObject中的編碼,
字串的編碼
字串型別的編碼有如下三種:
- int:8個位元組的長整型,
- embstr:小于等于44個位元組的字串,
- raw:大于44個位元組的字串,
在3.2版本之后,embstr和raw變為了44位元組為分界,之前是以39位元組為分界,這里以較新版本為準,
為了驗證和理解,我們使用object encoding命令查看一下內部編碼,
整數型別效果如下:
127.0.0.1:6379> set one-more-num 1
OK
127.0.0.1:6379> object encoding one-more-num
"int"
短字串型別效果如下:
127.0.0.1:6379> set one-more-str 萬貓學社
OK
127.0.0.1:6379> object encoding one-more-str
"embstr"
長字串型別效果如下:
127.0.0.1:6379> set one-more-str 萬貓學社|萬貓學社|萬貓學社|萬貓學社|萬貓學社|萬貓學社|萬貓學社|萬貓學社
OK
127.0.0.1:6379> object encoding one-more-str
"raw"
當然,了解以上細節還沒能完全“征服”面試官,我們需要更深入一些:)
簡單動態字串
在C語言中,字串是以空字符表示結尾的字符陣列,在Redis中沒有直接使用C語言的字串,而是定義了一個叫做簡單動態字串(Simple Dynamic String,SDS)的結構,并把其作為Redis默認的字串表示,
簡單動態字串有三個屬性:
len:記錄buf字符陣列中已使用的位元組數量free:記錄buf字符陣列中為使用的位元組數量buf[]:字符陣列,用于保存字串
為了理解,我們舉個例子:
127.0.0.1:6379> set one-more-str OneMore
OK
那么,對應的簡單動態字串就是這樣的:

其中,len為7,表示這個簡單動態字串中保存了一個7個位元組的字串;free為0,表示這個簡單動態字串沒有分配未使用的空間;buf是一個字符陣列,陣列的前7個位元組分別保存了O、n、e、M、o、r、e字符,最后一個位元組是空字符\0,
相對于C語言的字串,簡單動態字串有什么好處呢?
- 獲取字串長度的時間復雜度為O(1),
- 可以保存位元組陣列,支持安全的二進制資料存盤,
- 內部實作了記憶體空間的預分配機制,減少記憶體空間分配次數,
- 內部實作了惰性洗掉機制,字串縮減后記憶體不釋放,做為預分配空間,
- API是安全的,不會造成緩沖區溢位,
面試官你等著瞧吧,今天你對我愛答不理,明天我讓你高攀不起,哈哈哈,,,
參考文獻:
《Redis設計與實作》
《Redis開發與運維》
《Redis 深度歷險:核心原理與應用實踐》
竟然已經看到這里了,你我定是有緣人,留下你的點贊和關注,他日必成大器,
微信公眾號:萬貓學社
微信掃描二維碼
關注后回復「電子書」
獲取12本Java必讀技術書籍
作者:萬貓學社
出處:http://www.cnblogs.com/heihaozi/
著作權宣告:本文遵循 CC 4.0 BY-NC-SA 著作權協議,轉載請附上原文出處鏈接和本宣告,
微信掃描二維碼,關注萬貓學社,回復「電子書」,免費獲取12本Java必讀技術書籍,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/440462.html
標籤:其他
