redis 數據結構與對象 面試題

1、redis有哪幾種類型對象
string(字符串)list(列表)hash(哈希)set(集合)zset(有序集合)
2、redis對象的底層結構
unsigned type對象類型,unsigned encoding 編碼方式,void* ptr指向底層數據結構的指針
3、對象的編碼方式有哪些
long類型的整數、embstr編碼的簡單動態字符串、簡單動態字符串(raw)、字典、雙端隊列、壓縮鏈表、整數集合、跳躍表和字典
注:每種對象至少有兩種編碼類型,且在數據少量的情況下會使用優化的數據結構(效率高且靈活)
4、embstr與raw的不同
embstr是保存字符串長度小於32字節的字符串編碼方式。
raw編碼長的字符串(>=32字節)
ematr函數創建對象分配1次內存,而raw分配兩次。
embatr編碼的字符串,sdshdr和redisObject是連續的,raw是分開的所以raw分配兩次內存。
5、什麼情況下列表對象、hash對象使用壓縮列表編碼
對象字符串元素長度小於64字節、元素個數小於512個
6、集合對象使用intset編碼的條件
元素是整數,數量不超過512
7、什麼情況下有序集合使用壓縮列表編碼
元素數量小於128,元素長度小於64字節
8、特定的命令只能通過特定的鍵執行,那麼redis是如何檢查命令類型是否匹配的?
通過檢查redisObject的類型屬性。
9、介紹下redis的內存回收機制
redis內存回收是通過引用計數機制,每個對象內部都含有一個屬性記錄被引用次數,創建新對象是計數值初始化爲1,當次數爲0時,對象所佔內存會被釋放。
10、對象共享機制
數據庫的鍵的值指針指向現有對象,被共享對象引用計數值加一
( redis初始化服務器時,會初始化1萬個字符串,包含了從0到9999所有整數值。)
11、sds的底層結構
記錄了長度,空閒空間,字符串
12爲什麼使用SDS而不是c++字符串?
1、常數階複雜度獲取字符串長度(設置和更新sds的長度由sds的api在執行時自動完成)
2、杜絕緩衝區溢出(C語言字符串在拼接時可能會導致緩衝區溢出。sds會檢查空間大小,自動擴容)
3、減少修改字符串時帶來的內存重分配次數(通過未使用的空間,sds實現了空間預分配和惰性空間釋放兩種優化策略)(空間預分配。修改sds時,未使用空間分配公式:1、sds長度小於1MB時,len與free相等。2、sds的長度大於1MB,free等於1MB)(惰性空間釋放,用於優化sds的字符串的縮短。當sds的字符串縮短時,程序並不立即回收多餘字節,而是使用free記錄這些字節。)
4、二進制安全(sds的API都會以處理二進制的方式來處理buf數組,程序不會對其中的數據做任何限制、過濾、或者假設,數據寫入和讀取都是一樣的。C字符串不能儲存音視頻,因爲以’\0’區分字符串末尾。)
5、兼容部分c字符串函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章