redis 單機(jī)數(shù)據(jù)庫的實現(xiàn)

數(shù)據(jù)庫鍵空間

Redis 是一個鍵值對(key-value pair)數(shù)據(jù)庫服務(wù)器兽泄, 服務(wù)器中的每個數(shù)據(jù)庫都由一個 redis.h/redisDb 結(jié)構(gòu)表示薪前, 其中, redisDb 結(jié)構(gòu)的dict 字典保存了數(shù)據(jù)庫中的所有鍵值對, 我們將這個字典稱為鍵空間(key space):

typedef struct redisDb {

    // ...

    // 數(shù)據(jù)庫鍵空間,保存著數(shù)據(jù)庫中的所有鍵值對
    dict *dict;

    // ...

} redisDb;

鍵空間和用戶所見的數(shù)據(jù)庫是直接對應(yīng)的:

  • 鍵空間的鍵也就是數(shù)據(jù)庫的鍵历帚, 每個鍵都是一個字符串對象。
  • 鍵空間的值也就是數(shù)據(jù)庫的值杠娱, 每個值可以是字符串對象挽牢、列表對象、哈希表對象摊求、集合對象和有序集合對象在內(nèi)的任意一種 Redis 對象禽拔。

舉個例子, 如果我們在空白的數(shù)據(jù)庫中執(zhí)行以下命令:

redis> SET message "hello world"
OK

redis> RPUSH alphabet "a" "b" "c"
(integer) 3

redis> HSET book name "Redis in Action"
(integer) 1

redis> HSET book author "Josiah L. Carlson"
(integer) 1

redis> HSET book publisher "Manning"
(integer) 1

那么在這些命令執(zhí)行之后睹簇, 數(shù)據(jù)庫的鍵空間將會是圖 IMAGE_DB_EXAMPLE 所展示的樣子:

  • alphabet 是一個列表鍵奏赘, 鍵的名字是一個包含字符串 "alphabet" 的字符串對象寥闪, 鍵的值則是一個包含三個元素的列表對象太惠。
  • book 是一個哈希表鍵, 鍵的名字是一個包含字符串 "book" 的字符串對象疲憋, 鍵的值則是一個包含三個鍵值對的哈希表對象凿渊。
  • message 是一個字符串鍵, 鍵的名字是一個包含字符串 "message" 的字符串對象, 鍵的值則是一個包含字符串 "hello world" 的字符串對象埃脏。
數(shù)據(jù)庫鍵空間的事例

所以對數(shù)據(jù)庫的增刪改查也是對鍵空間字典的增刪改查搪锣。

重點

  • Redis 服務(wù)器的所有數(shù)據(jù)庫都保存在 redisServer.db 數(shù)組中, 而數(shù)據(jù)庫的數(shù)量則由 redisServer.dbnum 屬性保存彩掐。
  • 客戶端通過修改目標(biāo)數(shù)據(jù)庫指針构舟, 讓它指向 redisServer.db 數(shù)組中的不同元素來切換不同的數(shù)據(jù)庫。
  • 數(shù)據(jù)庫主要由 dict 和 expires 兩個字典構(gòu)成堵幽, 其中 dict 字典負(fù)責(zé)保存鍵值對狗超, 而 expires 字典則負(fù)責(zé)保存鍵的過期時間。
  • 因為數(shù)據(jù)庫由字典構(gòu)成朴下, 所以對數(shù)據(jù)庫的操作都是建立在字典操作之上的努咐。
  • 數(shù)據(jù)庫的鍵總是一個字符串對象, 而值則可以是任意一種 Redis 對象類型殴胧, 包括字符串對象渗稍、哈希表對象、集合對象团滥、列表對象和有序集合對象竿屹, 分別對應(yīng)字符串鍵、哈希表鍵灸姊、集合鍵羔沙、列表鍵和有序集合鍵。
  • expires 字典的鍵指向數(shù)據(jù)庫中的某個鍵厨钻, 而值則記錄了數(shù)據(jù)庫鍵的過期時間扼雏, 過期時間是一個以毫秒為單位的 UNIX 時間戳。
  • Redis 使用惰性刪除和定期刪除兩種策略來刪除過期的鍵: 惰性刪除策略只在碰到過期鍵時才進(jìn)行刪除操作夯膀, 定期刪除策略則每隔一段時間诗充, 主動查找并刪除過期鍵。
  • 執(zhí)行 SAVE 命令或者 BGSAVE 命令所產(chǎn)生的新 RDB 文件不會包含已經(jīng)過期的鍵诱建。
  • 執(zhí)行 BGREWRITEAOF 命令所產(chǎn)生的重寫 AOF 文件不會包含已經(jīng)過期的鍵蝴蜓。
  • 當(dāng)一個過期鍵被刪除之后, 服務(wù)器會追加一條 DEL 命令到現(xiàn)有 AOF 文件的末尾俺猿, 顯式地刪除過期鍵茎匠。
  • 當(dāng)主服務(wù)器刪除一個過期鍵之后, 它會向所有從服務(wù)器發(fā)送一條 DEL 命令押袍, 顯式地刪除過期鍵诵冒。
  • 從服務(wù)器即使發(fā)現(xiàn)過期鍵, 也不會自作主張地刪除它谊惭, 而是等待主節(jié)點發(fā)來 DEL 命令汽馋, 這種統(tǒng)一侮东、中心化的過期鍵刪除策略可以保證主從服務(wù)器數(shù)據(jù)的一致性。
  • 當(dāng) Redis 命令對數(shù)據(jù)庫進(jìn)行修改之后豹芯, 服務(wù)器會根據(jù)配置悄雅, 向客戶端發(fā)送數(shù)據(jù)庫通知。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铁蹈,一起剝皮案震驚了整個濱河市宽闲,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌握牧,老刑警劉巖便锨,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異我碟,居然都是意外死亡放案,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進(jìn)店門矫俺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吱殉,“玉大人,你說我怎么就攤上這事厘托∮仰ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵铅匹,是天一觀的道長押赊。 經(jīng)常有香客問我,道長包斑,這世上最難降的妖魔是什么流礁? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮罗丰,結(jié)果婚禮上神帅,老公的妹妹穿的比我還像新娘。我一直安慰自己萌抵,他們只是感情好找御,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绍填,像睡著了一般霎桅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讨永,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天滔驶,我揣著相機(jī)與錄音,去河邊找鬼住闯。 笑死瓜浸,一個胖子當(dāng)著我的面吹牛澳淑,可吹牛的內(nèi)容都是我干的比原。 我是一名探鬼主播插佛,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼量窘!你這毒婦竟也來了雇寇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚌铜,失蹤者是張志新(化名)和其女友劉穎锨侯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冬殃,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡囚痴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了审葬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片深滚。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涣觉,靈堂內(nèi)的尸體忽然破棺而出痴荐,到底是詐尸還是另有隱情,我是刑警寧澤官册,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布生兆,位于F島的核電站,受9級特大地震影響膝宁,放射性物質(zhì)發(fā)生泄漏鸦难。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一员淫、第九天 我趴在偏房一處隱蔽的房頂上張望明刷。 院中可真熱鬧,春花似錦满粗、人聲如沸辈末。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挤聘。三九已至,卻和暖如春捅彻,著一層夾襖步出監(jiān)牢的瞬間组去,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工步淹, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留从隆,地道東北人诚撵。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像键闺,于是被迫代替她去往敵國和親寿烟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容