Redis常見(jiàn)數(shù)據(jù)結(jié)構(gòu)以及使用場(chǎng)景分別是什么?
大家好,我是阿秀。
大家五一過(guò)的怎么樣啊?有沒(méi)有出去玩,哦不,有沒(méi)有被堵在路上...
機(jī)智的我選擇呆在實(shí)驗(yàn)室里看B站技術(shù)視頻和《計(jì)算機(jī)程序的構(gòu)造和解釋》。
五一結(jié)束之后再出去溜達(dá)溜達(dá),嘿嘿,完美避開(kāi)游客高峰期。
阿秀五一期間除了瘋狂卷肝視頻之外也沒(méi)閑著,還把以前自己做的 Redis 筆記好好整理了一遍,大概整理出 25 道高頻面試題。由于篇幅原因,一次性更新 25 道題導(dǎo)致整體太過(guò)冗長(zhǎng),很多人可能根本看不過(guò)來(lái),所以 Redis 篇打算分為兩期更新。
另外,C++、操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)、MySQL 的硬核面試資料均已更新完畢,如果有還沒(méi)看過(guò)的可以先去看看啦。
《逆襲進(jìn)大廠系列》(包含C++、操作系統(tǒng)、計(jì)算機(jī)網(wǎng)絡(luò)、MySQL、Redis、情景題)
下面就把本期的 Redis 分享給大家吧。
1、聽(tīng)說(shuō)過(guò)Redis嗎?它是什么?
Redis是一個(gè)數(shù)據(jù)庫(kù),不過(guò)與傳統(tǒng)數(shù)據(jù)庫(kù)不同的是Redis的數(shù)據(jù)庫(kù)是存在內(nèi)存中,所以讀寫(xiě)速度非常快,因此 Redis被廣泛應(yīng)用于緩存方向。
除此之外,Redis也經(jīng)常用來(lái)做分布式鎖,Redis提供了多種數(shù)據(jù)類(lèi)型來(lái)支持不同的業(yè)務(wù)場(chǎng)景。除此之外,Redis 支持事務(wù)持久化、LUA腳本、LRU驅(qū)動(dòng)事件、多種集群方案。
2、Redis的五種數(shù)據(jù)結(jié)構(gòu)整理簡(jiǎn)單動(dòng)態(tài)字符串(Simple Dynamic String,SDS)
Redis沒(méi)有直接使用C語(yǔ)言傳統(tǒng)的字符串,而是自己構(gòu)建了一種名為簡(jiǎn)單動(dòng)態(tài)字符串(Simple dynamic string,SDS)的抽象類(lèi)型,并將SDS用作Redis的默認(rèn)字符串表示。
其實(shí)SDS等同于C語(yǔ)言中的char * ,但它可以存儲(chǔ)任意二進(jìn)制數(shù)據(jù),不能像C語(yǔ)言字符串那樣以字符’’來(lái)標(biāo)識(shí)字符串的結(jié) 束,因此它必然有個(gè)長(zhǎng)度字段。
定義struct sdshdr {
// 記錄buf數(shù)組中已使用字節(jié)的數(shù)量
// 等于sds所保存字符串的長(zhǎng)度
int len;
// 記錄buf數(shù)組中未使用字節(jié)的數(shù)量
int free;
// 字節(jié)數(shù)組,用于保存字符串
char buf[];
}
優(yōu)點(diǎn)獲取字符串長(zhǎng)度的復(fù)雜度為O(1)。杜絕緩沖區(qū)溢出。減少修改字符串長(zhǎng)度時(shí)所需要的內(nèi)存重分配次數(shù)。二進(jìn)制安全。兼容部分C字符串函數(shù)。
它具有很常規(guī)的 set/get 操作,value 可以是String也可以是數(shù)字,一般做一些復(fù)雜的計(jì)數(shù)功能的緩存。
鏈表
當(dāng)有一個(gè)列表鍵包含了數(shù)量比較多的元素,又或者列表中包含的元素都是比較長(zhǎng)的額字符串時(shí),Redis就會(huì)使用鏈表作為列表建的底層實(shí)現(xiàn)。
節(jié)點(diǎn)底層結(jié)構(gòu)typedef struct listNode {
// 前置節(jié)點(diǎn)
struct listNode *prev;
// 后置節(jié)點(diǎn)
struct listNode *next;
// 節(jié)點(diǎn)的值
void *value;
} listNode;
list底層結(jié)構(gòu)typedef struct list {
// 表頭節(jié)點(diǎn)
listNode *head;
// 表尾節(jié)點(diǎn)
listNode *tail;
// 鏈表所包含的節(jié)點(diǎn)數(shù)量
unsigned long len;
// 節(jié)點(diǎn)值復(fù)制函數(shù)
void *(*dup)(void *ptr);
// 節(jié)點(diǎn)值是放過(guò)函數(shù)
void (*free)(void *ptr);
// 節(jié)點(diǎn)值對(duì)比函數(shù)
int(*match)(void *ptr, void *key);
} list;
特性鏈表被廣泛用于實(shí)現(xiàn)Redis的各種功能,比如列表建、發(fā)布與訂閱、慢查詢(xún)、監(jiān)視器等。每個(gè)鏈表節(jié)點(diǎn)由一個(gè)listNode結(jié)構(gòu)來(lái)表示,每個(gè)節(jié)點(diǎn)都有一個(gè)指向前置節(jié)點(diǎn)和后置節(jié)點(diǎn)的指針,所以Redis的鏈表實(shí)現(xiàn)是雙端鏈表。每個(gè)鏈表使用一個(gè)list結(jié)構(gòu)表示,這個(gè)結(jié)構(gòu)帶有表頭節(jié)點(diǎn)指針、表尾節(jié)點(diǎn)指針,以及鏈表長(zhǎng)度等信息。因?yàn)殒湵肀眍^的前置節(jié)點(diǎn)和表尾節(jié)點(diǎn)的后置節(jié)點(diǎn)都指向NULL,所以Redis的鏈表實(shí)現(xiàn)是無(wú)環(huán)鏈表。通過(guò)為鏈表設(shè)置不同的類(lèi)型特定函數(shù),Redis的鏈表可以用于保存各種不同類(lèi)型的值。字典
字典的底層是哈希表,類(lèi)似 C++中的 map ,也就是鍵值對(duì)。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車(chē)電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車(chē)】汽車(chē)E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書(shū)】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專(zhuān)題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開(kāi)始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類(lèi)新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開(kāi)成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?