redis-數據庫

數據庫

Redis支持多個數據庫,而且每一個數據庫的數據是隔離的不能共享,而且基於單機纔有,若是是集羣就沒有數據庫的概念。 Redis是一個字典結構的存儲服務器,而實際上一個Redis實例提供了多個用來存儲數據的字典,客戶端能夠指定將數據存儲在哪一個字典中。這與咱們熟知的在一個關係數據庫實例中能夠建立多個數據庫相似,因此能夠將其中的每一個字典都理解成一個獨立的數據庫。html

每一個數據庫對外都是一個從0開始的遞增數字命名,Redis默認支持16個數據庫(能夠經過配置文件支持更多,無上限),能夠經過配置databases來修改這一數字。客戶端與Redis創建鏈接後會自動選擇0號數據庫,不過能夠隨時使用SELECT命令更換數據庫,如要選擇1號數據庫:redis

redis> SELECT 1
OK
redis [1] > GET foo
(nil)
複製代碼

數據庫鍵空間

Redis 是一個鍵值對(key-value pair)數據庫服務器, 服務器中的每一個數據庫都由一個 redis.h/redisDb 結構表示, 其中, redisDb 結構的 dict 字典保存了數據庫中的全部鍵值對, 咱們將這個字典稱爲鍵空間(key space):數據庫

typedef struct redisDb {

    // ...

    // 數據庫鍵空間,保存着數據庫中的全部鍵值對
    dict *dict;

    // ...

} redisDb;
複製代碼

鍵過時策略

redisDb結構的expries字典保存了數據庫全部的鍵過時時間,咱們稱這個字典爲過時字典: 過時字典的鍵是一個指針,這個指針指向鍵空間中的某個鍵對象(也便是某個數據庫鍵)。 過時字典的值是一個 long類型的整數,這個整數保存餓鍵所指向的數據庫鍵的過時時間,一個毫秒精度的UNIX時間戳。看下圖是帶有過時的時間的存儲機構。其中過時字典的鍵實際上是一個指針,對應同一個內存存儲。數組

過時鍵的刪除策略是按期刪除策略+惰性刪除策略 惰性刪除的策略以下圖:bash

按期刪除策略: 過時鍵的按期刪除策略由redis.c/activeExpireCycle函數實現,每當Redis的服務器週期性操做 redis.c/serverCron 函數執行時,activeExpireCycle函數就會被調用,它在規定的時間內,分屢次遍歷服務器中的各個數據庫,從數據庫的expires字典中隨機檢查一部分的過時時間,並刪除其中過時鍵。 函數每次運行時,都從必定數量的數據庫中取出必定數量的隨機鍵進行檢查,並刪除其中的過時鍵。

AOF,RDB和複製功能對過時鍵的處理

生成RDB文件,執行SAVE和BGSAVE命令時,程序會直接忽略過時的鍵。 載入RDD文件時 1.服務器以主服務器運行時,載入RDB會直接忽略過時的鍵 2.服務器以從服務器運行時,載入RDB不出來過時鍵,可是主同步的從服務器時,數據將 最終保存一致。 生成AOF文件時類型,AOF都是追加的命令,當過時時,會在AOF中追加DEL命令。當AOF重寫時,是以數據當時的狀態重寫,則過時的鍵會直接被忽略。 複製時,主服務器會主動刪除過時的數據,而後同步從服務器。從服務器只是讀取。服務器

subscribe 命令監聽數據庫的通知。

詳情能夠看命令 重點:函數

  • Redis 服務器的全部數據庫都保存在 redisServer.db 數組中, 而數據庫的數量則由 redisServer.dbnum 屬性保存。
  • 客戶端經過修改目標數據庫指針, 讓它指向 redisServer.db 數組中的不一樣元素來切換不一樣的數據庫。
  • 數據庫主要由 dict 和 expires 兩個字典構成, 其中 dict 字典負責保存鍵值對, 而 expires 字典則負責保存鍵的過時時間。 由於數據庫由字典構成, 因此對數據庫的操做都是創建在字典操做之上的。
  • 數據庫的鍵老是一個字符串對象, 而值則能夠是任意一種 Redis 對象類型, 包括字符串對象、哈希表對象、集合對象、列表對象和有序集合對象, 分別對應字符串鍵、哈希表鍵、集合鍵、列表鍵和有序集合鍵。
  • expires 字典的鍵指向數據庫中的某個鍵, 而值則記錄了數據庫鍵的過時時間, 過時時間是一個以毫秒爲單位的 UNIX 時間戳。
  • Redis 使用惰性刪除和按期刪除兩種策略來刪除過時的鍵: 惰性刪除策略只在碰到過時鍵時才進行刪除操做, 按期刪除策略則每隔一段時間, 主動查找並刪除過時鍵。
  • 執行 SAVE 命令或者 BGSAVE 命令所產生的新 RDB 文件不會包含已通過期的鍵。
  • 執行 BGREWRITEAOF 命令所產生的重寫 AOF 文件不會包含已通過期的鍵。
  • 當一個過時鍵被刪除以後, 服務器會追加一條 DEL 命令到現有 AOF 文件的末尾, 顯式地刪除過時鍵。
  • 當主服務器刪除一個過時鍵以後, 它會向全部從服務器發送一條 DEL 命令, 顯式地刪除過時鍵。
  • 從服務器即便發現過時鍵, 也不會自做主張地刪除它, 而是等待主節點發來 DEL 命令, 這種統1、中心化的過時鍵刪除策略能夠保證主從服務器數據的一致性。
  • 當 Redis 命令對數據庫進行修改以後, 服務器會根據配置, 向客戶端發送數據庫通知。
相關文章
相關標籤/搜索