目錄
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陣...