訂閱
糾錯
加入自媒體

Redis常見數(shù)據(jù)結構以及使用場景分別是什么?

2021-05-04 10:10
拓跋阿秀
關注

大家好,我是阿秀。

大家五一過的怎么樣啊?有沒有出去玩,哦不,有沒有被堵在路上...

機智的我選擇呆在實驗室里看B站技術視頻和《計算機程序的構造和解釋》。

五一結束之后再出去溜達溜達,嘿嘿,完美避開游客高峰期。

阿秀五一期間除了瘋狂卷肝視頻之外也沒閑著,還把以前自己做的 Redis 筆記好好整理了一遍,大概整理出 25 道高頻面試題。由于篇幅原因,一次性更新 25 道題導致整體太過冗長,很多人可能根本看不過來,所以 Redis 篇打算分為兩期更新。

另外,C++、操作系統(tǒng)、計算機網(wǎng)絡、MySQL 的硬核面試資料均已更新完畢,如果有還沒看過的可以先去看看啦。

《逆襲進大廠系列》(包含C++、操作系統(tǒng)、計算機網(wǎng)絡、MySQL、Redis、情景題)

下面就把本期的 Redis 分享給大家吧。

1、聽說過Redis嗎?它是什么?

Redis是一個數(shù)據(jù)庫,不過與傳統(tǒng)數(shù)據(jù)庫不同的是Redis的數(shù)據(jù)庫是存在內(nèi)存中,所以讀寫速度非常快,因此 Redis被廣泛應用于緩存方向。

除此之外,Redis也經(jīng)常用來做分布式鎖,Redis提供了多種數(shù)據(jù)類型來支持不同的業(yè)務場景。除此之外,Redis 支持事務持久化、LUA腳本、LRU驅動事件、多種集群方案。

2、Redis的五種數(shù)據(jù)結構整理簡單動態(tài)字符串(Simple Dynamic String,SDS)

Redis沒有直接使用C語言傳統(tǒng)的字符串,而是自己構建了一種名為簡單動態(tài)字符串(Simple dynamic string,SDS)的抽象類型,并將SDS用作Redis的默認字符串表示。

其實SDS等同于C語言中的char * ,但它可以存儲任意二進制數(shù)據(jù),不能像C語言字符串那樣以字符’’來標識字符串的結 束,因此它必然有個長度字段。

定義struct sdshdr {
   // 記錄buf數(shù)組中已使用字節(jié)的數(shù)量
   // 等于sds所保存字符串的長度
   int len;
   
   // 記錄buf數(shù)組中未使用字節(jié)的數(shù)量
   int free;
   
   // 字節(jié)數(shù)組,用于保存字符串
   char buf[];
}
優(yōu)點獲取字符串長度的復雜度為O(1)。杜絕緩沖區(qū)溢出。減少修改字符串長度時所需要的內(nèi)存重分配次數(shù)。二進制安全。兼容部分C字符串函數(shù)。

它具有很常規(guī)的 set/get 操作,value 可以是String也可以是數(shù)字,一般做一些復雜的計數(shù)功能的緩存。

鏈表

當有一個列表鍵包含了數(shù)量比較多的元素,又或者列表中包含的元素都是比較長的額字符串時,Redis就會使用鏈表作為列表建的底層實現(xiàn)。

節(jié)點底層結構typedef struct listNode {
   // 前置節(jié)點
   struct listNode *prev;
   // 后置節(jié)點
   struct listNode *next;
   // 節(jié)點的值
   void *value;
} listNode;
list底層結構typedef struct list {
   // 表頭節(jié)點
   listNode *head;
   // 表尾節(jié)點
   listNode *tail;
   // 鏈表所包含的節(jié)點數(shù)量
   unsigned long len;
   // 節(jié)點值復制函數(shù)
   void *(*dup)(void *ptr);
   // 節(jié)點值是放過函數(shù)
   void (*free)(void *ptr);
   // 節(jié)點值對比函數(shù)
   int(*match)(void *ptr, void *key);
} list;
特性鏈表被廣泛用于實現(xiàn)Redis的各種功能,比如列表建、發(fā)布與訂閱、慢查詢、監(jiān)視器等。每個鏈表節(jié)點由一個listNode結構來表示,每個節(jié)點都有一個指向前置節(jié)點和后置節(jié)點的指針,所以Redis的鏈表實現(xiàn)是雙端鏈表。每個鏈表使用一個list結構表示,這個結構帶有表頭節(jié)點指針、表尾節(jié)點指針,以及鏈表長度等信息。因為鏈表表頭的前置節(jié)點和表尾節(jié)點的后置節(jié)點都指向NULL,所以Redis的鏈表實現(xiàn)是無環(huán)鏈表。通過為鏈表設置不同的類型特定函數(shù),Redis的鏈表可以用于保存各種不同類型的值。字典

字典的底層是哈希表,類似 C++中的 map ,也就是鍵值對。

1  2  3  下一頁>  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號