天天看點

第三章 資料庫

  Redis伺服器将所有資料庫都儲存在伺服器狀态redis.h / redisServer結構的db數組中,db數組的每個項都是一個redis.h/redisDb結構,每個redisDb結構代表一個資料庫:

                       

  

第三章 資料庫

  Redis是一個鍵值對資料庫伺服器,伺服器中的每個資料庫由一個redis.h/redisDb結構表示,其中,redisDb結構的dict字典儲存了資料庫中所有的鍵值對,稱這個字典為鍵空間。

第三章 資料庫

  3.1 添加新鍵

第三章 資料庫

   

  3.2 删除鍵

第三章 資料庫
第三章 資料庫

  3.3 更新鍵

第三章 資料庫

  3.4 對鍵取值

第三章 資料庫
第三章 資料庫

  3.5 讀寫鍵空間時的維護操作

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

在讀取一個鍵後(讀和寫操作都要對鍵進行讀取),伺服器會根據鍵是否存在來更新伺服器的鍵空間命中(hit)次數或鍵空間不命中(miss)次數

在讀取一個鍵後,伺服器會更新鍵的LRU(最後一次使用)時間

如果伺服器在讀取一個鍵時,發現鍵已過期,伺服器會先删除過期鍵,再執行餘下操作

如果有用戶端使用WATCH指令監視了某個鍵,伺服器在對被監視的鍵進行修改後,會将這個鍵标記為髒(在事務一章會介紹)

伺服器每修改一個鍵之後,都會對髒鍵計數器的值增1,這個計數器會觸發伺服器的持久化和複制操作(在持久化和複制議長中介紹)

如果伺服器開啟了資料庫通知功能,在對鍵進行修改之後,伺服器将按配置發送相應的資料庫通知(釋出和訂閱一章中介紹)

  4.1 設定過期時間

EXPIRE<key> <ttl> 鍵的生存時間為 ttl ( time to live ) 秒

PEXPIRE<key> <ttl> 鍵的生存時間為 ttl ( time to live ) 毫秒

EXPIREAT <key> <timestamp> 指令用于将鍵的過期時間設定為timestamp所指定的秒時間戳

PEXPIREAT <key> <timestamp> 指令用于将鍵的過期時間設定為timestamp所指定的毫秒時間戳

  4.2 移除過期鍵

  PERSIST指令用于移除過期鍵。

第三章 資料庫

  4.3 計算并傳回剩餘生存時間

  TTL 指令以秒傳回鍵的生存時間,PTTL以毫秒傳回鍵的生存時間。

第三章 資料庫

定時删除(占用太多的CPU時間,影響伺服器的響應時間和吞吐量)

  在設定鍵的過期時間的同時,建立一個定時器(timer),讓定時器在鍵的過期時間來臨時,立即執行對鍵的删除操作。

惰性删除(浪費記憶體,有記憶體洩漏風險)

  放任鍵過期不管,但是每次從鍵空間擷取鍵時,都檢查取得的鍵是否過期,如果過期,就删除該鍵;如果沒有過期,就傳回該鍵。

定期删除

  每隔一段時間,程式就對資料庫進行一次檢查,删除裡面的過期鍵。

   Redis伺服器使用惰性删除和定期删除兩種政策。

  6.1 惰性删除政策

  6.2 定期删除政策的實作

  過期鍵的定期删除政策由redis.c/activeExpireCycle函數實作,每當Redis的伺服器周期性操作redis.c/serverCron函數時,activeExpireCycle函數就會被調用,整個過程的僞碼描述如下:

  7.1 生成RDB檔案

  在執行SAVE或BGSAVE指令建立一個新的RDB檔案時,程式會對資料庫中的鍵進行檢查,已過期的鍵不會被儲存到新建立的RDB檔案中。

  7.2 載入RDB檔案

  在啟動Redis伺服器時,如果伺服器開啟了RDB功能,那麼伺服器會對RDB檔案進行載入:

如果伺服器以主伺服器模式運作,在載入RDB檔案時,程式會對檔案中儲存的鍵進行檢查,隻有未過期的鍵會被載入到資料庫中

如果伺服器以從伺服器運作,載入RDB檔案時,檔案中儲存的所有鍵,無論過期與否都會被載入到資料庫中

  7.3 AOF檔案寫入

  當伺服器以AOF持久化模式運作時,如果資料庫中的某個鍵已經過期,且被惰性删除或定期删除之後,程式會向AOF檔案追加一條DEL指令,顯式記錄該鍵已被删除。

  7.4 AOF重寫

  和生成RDB檔案時類似,在執行AOF重寫的過程中,程式會對資料庫中的鍵進行檢查,已過期的鍵不會被儲存到重寫後的AOF檔案中

  7.5 複制

  當伺服器運作在複制模式下時,從伺服器的過期鍵删除動作由主伺服器控制:

主伺服器在删除一個過期鍵後,會顯式地向所有從伺服器發送一個DEL指令,告知從伺服器删除這個過期鍵

從伺服器在執行用戶端發送的讀指令時,即使碰到過期鍵,也不會将過期鍵删除

從伺服器隻有在接到主伺服器地DEL指令之後,才會删除過期鍵