Redis 單機資料庫的實現 資料庫原理

2021-09-30 18:37:58 字數 2128 閱讀 4370

目錄

1. 伺服器中的資料庫

2. 資料庫鍵空間

2.1. 讀寫空間時的維護操作

3. 過期時間

4. 過期刪除策略

4.1. 定時刪除

4.2. 惰性刪除

4.3. 定期刪除

4.4. redis刪除策略

5. aof、rdb和複製功能對對過期鍵的處理

5.1. rdb

5.2. aof

5.3. 複製

6. 資料庫通知

redis也是個程式,用c語言寫的,那麼儲存資料是需要乙個資料結構的,那麼redis中的資料庫是什麼結構呢

大概的樣子如上圖所示

redisserver通過dbnum來確定初始化的時候,需要新建多少個資料庫,也就是db陣列

而redisclient連線的時候需要選定操作是那個資料庫,預設是0號庫,也能通過select命令選擇使用那個資料庫,例如select 1,選擇了1號庫,那麼這個時候就如上圖所示

每乙個client連線到server,都會再server儲存乙個client例項

資料庫鍵是乙個字串物件

資料庫值可以是字串物件,列表,集合,雜湊物件等等,任意一種redis物件

如下圖所示

「xx」 表示乙個字串物件

可以看出,資料庫的底層是用dict,也就是雜湊物件實現的

當使用redis命令對資料庫進行讀寫時候,伺服器不僅會對鍵空間執行指定的讀寫操作,還會執行一項額外的維護操作

expire命令和pexpire命令

前者是設定秒,後者是設定毫秒

本質上是通過將秒轉換為時間戳實現的,例如expire  5  這樣會將當期時間+5算到時間戳,當時間戳的時間來臨就過期

pexpireat  《時間戳》  所有設定過期時間的命令都是用這個命令實現的  這個時間戳是毫秒級別,對應有個expireat秒級別

這個過期時間儲存地方如下圖所示

這裡過期時間的expires中的key和dict中的key是同乙個物件,redis做了復用,不會造成2倍的記憶體消耗

一般來說刪除策略分為3種

定時刪除

惰性刪除

定期刪除

對記憶體最友好,通過定時器實現,保證過期鍵會盡可能快的被刪除,並釋放過期鍵所占用的記憶體,缺點就是對cpu不友好,過期鍵很多情況下,刪除過期鍵會占用很多cpu,容易造成吞吐量影響

redis建立定時器需要用到redis伺服器中的時間事件,時間事件的實現方式無序列表,時間複雜度是o(n)

而且對每個鍵都建立個定時器,也不正常,不現實

對cpu最友好,程式只會在取出鍵的時候檢查,判斷是否過期,同理對記憶體不友好,可能過期之後,長期沒有訪問,一直存在,可以看成是一種記憶體洩漏

定期刪除可以看成上面兩種的折中

定期刪除的策略是每隔一段時間執行一次刪除過期鍵的操作,並通過限制操作執行頻率和時長減少對cpu影響,簡單來說,限制時間,限制刪除鍵數量來操作

redis採用定期刪除和惰性刪除兩種策略配合使用

惰性刪除

redis在呼叫讀寫命令之前都會判斷鍵是否過期,過期就刪除

定期刪除

在規定時間內,分多次遍歷伺服器中各個資料庫,從資料庫的expires字典中隨機拿出一部分鍵的過期時間,檢查是否過期,並刪除過期鍵

有個全域性變數記錄當前操作那個資料庫,當執行完最後乙個資料庫時候,計數器歸0,從新開始

每次開始的操作時候,有兩個變數控制,時間,清除過期鍵梳理,如果在操作過程中,時間到期,則操作結束,如果時間沒有到期,但是清除了規定的鍵梳理,操作也結束

過期鍵在生成rdb檔案時候,不會儲存進rdb檔案中

在載入rdb檔案時候,主伺服器會根據鍵是否過期來判斷是否載入這個鍵,從伺服器則載入所有,不管是否過期,但是主從同步資料之後,過期鍵還是會被刪除

當乙個鍵過期了,會追加一條del命令進aof檔案

重寫aof時候,會判斷鍵是否過期,過期的鍵會被忽略

在主從模式下,從伺服器的過期鍵刪除動作由主伺服器控制

主伺服器刪除乙個鍵,顯示向所有伺服器傳送乙個del命令,告知所有從伺服器這個鍵被刪除

從伺服器在執行客戶端讀命令,遇見過期鍵也不會刪除

當redis命令對資料庫進行了修改之後,伺服器會根據配置向客戶端傳送資料庫通知,包含事件名稱,產生事件的鍵,產生事件的資料庫編號確定事件內容

redis原始碼 單機資料庫的實現

redis伺服器將所有資料庫都儲存在伺服器狀態db陣列中。dbnum由conf檔案database選項決定。struct redisserver 分析rdb檔案 od c dump.rdbredis事件驅動 redis伺服器是乙個事件驅動程式,伺服器需要處理以下兩類事件 檔案事件 檔案事件就是伺服器...

Redis資料庫實現

redis伺服器將所有資料庫都儲存在伺服器狀態redis.h redisserver結構的db陣列中,db陣列的每一項都是乙個redisdb結構,每個redisdb代表乙個資料庫。struct redisserver 每個redis客戶端都有自己的目標資料庫,預設情況下redis客戶端的目標資料庫為...

《Redis設計與實現》學習筆記 單機資料庫

乙個redis伺服器例項在單機執行時可以新增多個資料庫來儲存鍵值對,redis在實現中通過乙個redisdb結構體來描述資料庫,該結構體中有乙個字典型別的字段來儲存資料庫中所有的鍵值對,redisserver結構體來描述伺服器例項,該結構體中有乙個dbnum欄位來儲存資料庫數量,乙個redisdb陣...