Redis設實 09 資料庫

2021-08-06 07:03:29 字數 3919 閱讀 1922

《redis設計與實現 黃建巨集 著》第9章

該書基於redis2.9,即redis3.0開發版編寫

redis伺服器資料結構

typedef structredisserverredisserver;

redis資料庫資料結構

typedef structredisdbredisdb;

注,因資料庫鍵空間是乙個字典,故所有對資料庫的操作,實際上都是通過對字典進行操作來實現的

redis客戶端狀態資料結構

typedef structredisclientredisclient;

通過修改redisclient.db指標指向不同資料庫,從而實現切換目標資料庫的功能,這是select命令的實現原理

redis命令對資料庫進行讀寫時的額外維護操作(讀、寫操作都對鍵進行讀取)

1) 讀取乙個鍵後,伺服器會根據鍵是否存在去更新鍵空間命中或不命中次數,這兩個值可在info stats命令的keyspace_hits和keyspace_misses屬性中檢視

2) 讀取乙個鍵後,伺服器會更新鍵的lru時間

3) 若伺服器讀取乙個鍵時發現該鍵已過期,則會先刪除該鍵,然後執行其他操作

4) 若有客戶端使用watch命令監視某個鍵,則伺服器在對被監視的鍵進行修改後,會將該鍵標記為「髒」,從而讓事務程式注意到該鍵被修改過

5) 伺服器每修改乙個鍵後,都會對「髒」鍵計數器的值+1,該計數器會觸發伺服器的持久化及複製操作

6) 若伺服器開啟了資料庫通知功能,則在對鍵進行修改後,伺服器將按配置傳送相應的資料庫通知

4個設定鍵過期命令

·expire將鍵key的生存時間設定為ttl秒

·pexpire將鍵key的生存時間設定為ttl毫秒

·expireat將鍵key的過期時間設定為timestamp指定的秒數時間戳

·pexpireat將鍵key的過期時間設定為timestamp指定的毫秒數時間戳

注,

實際上expire、pexpire、expireat3個命令都使用pexpireat命令實現

pexpireat命令為資料庫鍵設定過期時間時,伺服器會在過期字典中關聯給定的資料庫鍵和過期時間

過期字典

資料庫中所有鍵的過期時間儲存在過期字典(redisdb.expires)中

typedef structredisdbredisdb;

·過期字典的鍵是乙個指標,該指標指向鍵空間中的某個資料庫鍵

·過期字典的值是乙個long long型別整數,該整數儲存鍵所指向的資料庫鍵的過期時間,乙個毫秒精度unix時間戳

移除過期時間命令

persist解除資料庫鍵和過期時間在過期字典中的關聯

檢視剩餘生存時間命令

ttl檢視以秒為單位的剩餘生存時間

pttl檢視以毫秒為單位的剩餘生存時間

過期鍵判定步驟

1) 檢查給定鍵是否存在於過期字典,若存在,則取得鍵的過期時間,否則鍵未過期

2) 檢查當前unix時間戳是否大於鍵的過期時間,若是,則鍵已過期,否則鍵未過期

過期刪除策略

redis伺服器使用惰性刪除和定期刪除兩種策略配合刪除過期鍵

惰性刪除策略

redis伺服器執行命令前會對輸入鍵進行檢查:

·若輸入鍵已過期,則將該鍵從資料庫刪除

·若輸入鍵未過期,則不做任何動作

定期刪除策略

redis伺服器週期性執行以下過期鍵刪除操作

·從一定數量資料庫中取一定數量隨機鍵進行檢查,並刪除其中的過期鍵

·記錄檢查進度,並在下次檢查時接著上次的進度繼續進行檢查

·隨著以上操作迴圈執行,伺服器中所有資料庫都會被檢查一遍,然後再次開始新一輪檢查工作

rdb對過期鍵的處理

生成rdb檔案時,過期鍵不會被儲存到新建立rdb檔案中

載入rdb檔案時,

若伺服器以主伺服器模式執行,過期鍵不會被載入到資料庫

若伺服器以從伺服器模式執行,所有鍵,不論是否過期,都被載入到資料庫

注,主從伺服器進行資料同步時,從伺服器資料庫會被清空,故,從伺服器載入過期鍵不會對資料一致性產生影響

aof對過期鍵的處理

aof寫入檔案時,

若資料庫中某鍵已過期,但未被惰性刪除或定期刪除,則該過期鍵會繼續被寫入檔案

當該過期鍵被惰性刪除或定期刪除後,程式向aof檔案追加del命令,顯式地記錄該鍵已被刪除

aof重寫時,過期鍵不會被寫入重寫檔案

複製模式對過期鍵的處理

從伺服器過期鍵刪除動作由主伺服器控制:

·主伺服器刪除過期鍵後,顯式地向所有從伺服器傳送del命令,告知從伺服器刪除該過期鍵

·從伺服器執行客戶端讀命令時,即使碰到過期鍵也不會將過期鍵刪除,而是繼續像處理未過期鍵一樣處理過期鍵

·從伺服器只有在接到主伺服器發來的del命令後,才會刪除過期鍵

注,以上機制可保證主從伺服器資料一致性

客戶端可通過訂閱給定的頻道或模式,獲知資料庫中鍵的變化,及資料庫中命令的執**況

2類通知

鍵空間通知(key-space notification),關注「某個鍵執行了什麼命令」(以鍵為核心)

鍵事件通知(key-event notification),關注「某個命令被什麼鍵執行了」(以命令為核心)

傳送通知的配置

伺服器配置中notify-keyspace-events選項設定傳送通知的型別,可選值及含義:

·ake,傳送所有型別的鍵空間通知和鍵事件通知

·ak,傳送所有型別的鍵空間通知

·ae,傳送所有型別的鍵事件通知

·k$,只傳送和字串鍵有關的鍵空間通知

·el,只傳送和列表鍵有關的鍵事件通知

傳送通知函式

void notifykeyspaceevent(int type, char *event, robj *key, int dbid);

type,通知型別,程式根據該值判斷該通知是否是伺服器配置選定的通知型別,進而決定是否傳送通知

event,事件名稱

keys,產生事件的鍵

dbid,產生事件的資料庫號碼

函式根據上述4個引數構建事件通知的內容,及接收通知的頻道名

傳送通知函式的實現(過程)

1) 檢查伺服器是否允許傳送該通知型別,若否,則直接返回

2) 檢查伺服器是否允許傳送鍵空間通知,若是,則構建並傳送事件通知

3) 檢查伺服器是否允許傳送鍵事件通知,若是,則構建並傳送事件通知

MySQL資料庫實操教程 09 更新資料

自定義view系列教程00 推翻自己和過往,重學自定義view 自定義view系列教程01 常用工具介紹 自定義view系列教程02 onmeasure原始碼詳盡分析 自定義view系列教程03 onlayout原始碼詳盡分析 自定義view系列教程04 draw原始碼分析及其實踐 自定義view系...

Redis設實 05 整數集合

redis設計與實現 黃建巨集 著 第6章 該書基於redis2.9,即redis3.0開發版編寫 用於儲存整數值的集合抽象資料結構 可儲存型別為int16 t int32 t int64 t的整數值 集合中不會出現重複元素 typedef struct intsetintset 整數集合的底層實現...

Redis設實 06 壓縮列表

redis設計與實現 黃建巨集 著 第7章 該書基於redis2.9,即redis3.0開發版編寫 為節約記憶體而開發 由一系列特殊編碼的連續記憶體塊組成的順序型 sequential 資料結構 可包含任意多個節點 entry 每個節點可儲存乙個位元組陣列或乙個整數值 1個壓縮列表節點可儲存1個位元...