數(shù)據(jù)庫鍵空間
Redis 是一個鍵值對(key-value pair)數(shù)據(jù)庫服務(wù)器兽泄, 服務(wù)器中的每個數(shù)據(jù)庫都由一個 redis.h/redisDb 結(jié)構(gòu)表示薪前, 其中, redisDb 結(jié)構(gòu)的dict 字典保存了數(shù)據(jù)庫中的所有鍵值對, 我們將這個字典稱為鍵空間(key space):
typedef struct redisDb {
// ...
// 數(shù)據(jù)庫鍵空間,保存著數(shù)據(jù)庫中的所有鍵值對
dict *dict;
// ...
} redisDb;
鍵空間和用戶所見的數(shù)據(jù)庫是直接對應(yīng)的:
- 鍵空間的鍵也就是數(shù)據(jù)庫的鍵历帚, 每個鍵都是一個字符串對象。
- 鍵空間的值也就是數(shù)據(jù)庫的值杠娱, 每個值可以是字符串對象挽牢、列表對象、哈希表對象摊求、集合對象和有序集合對象在內(nèi)的任意一種 Redis 對象禽拔。
舉個例子, 如果我們在空白的數(shù)據(jù)庫中執(zhí)行以下命令:
redis> SET message "hello world"
OK
redis> RPUSH alphabet "a" "b" "c"
(integer) 3
redis> HSET book name "Redis in Action"
(integer) 1
redis> HSET book author "Josiah L. Carlson"
(integer) 1
redis> HSET book publisher "Manning"
(integer) 1
那么在這些命令執(zhí)行之后睹簇, 數(shù)據(jù)庫的鍵空間將會是圖 IMAGE_DB_EXAMPLE 所展示的樣子:
- alphabet 是一個列表鍵奏赘, 鍵的名字是一個包含字符串 "alphabet" 的字符串對象寥闪, 鍵的值則是一個包含三個元素的列表對象太惠。
- book 是一個哈希表鍵, 鍵的名字是一個包含字符串 "book" 的字符串對象疲憋, 鍵的值則是一個包含三個鍵值對的哈希表對象凿渊。
- message 是一個字符串鍵, 鍵的名字是一個包含字符串 "message" 的字符串對象, 鍵的值則是一個包含字符串 "hello world" 的字符串對象埃脏。
數(shù)據(jù)庫鍵空間的事例
所以對數(shù)據(jù)庫的增刪改查也是對鍵空間字典的增刪改查搪锣。
重點
- Redis 服務(wù)器的所有數(shù)據(jù)庫都保存在 redisServer.db 數(shù)組中, 而數(shù)據(jù)庫的數(shù)量則由 redisServer.dbnum 屬性保存彩掐。
- 客戶端通過修改目標(biāo)數(shù)據(jù)庫指針构舟, 讓它指向 redisServer.db 數(shù)組中的不同元素來切換不同的數(shù)據(jù)庫。
- 數(shù)據(jù)庫主要由 dict 和 expires 兩個字典構(gòu)成堵幽, 其中 dict 字典負(fù)責(zé)保存鍵值對狗超, 而 expires 字典則負(fù)責(zé)保存鍵的過期時間。
- 因為數(shù)據(jù)庫由字典構(gòu)成朴下, 所以對數(shù)據(jù)庫的操作都是建立在字典操作之上的努咐。
- 數(shù)據(jù)庫的鍵總是一個字符串對象, 而值則可以是任意一種 Redis 對象類型殴胧, 包括字符串對象渗稍、哈希表對象、集合對象团滥、列表對象和有序集合對象竿屹, 分別對應(yīng)字符串鍵、哈希表鍵灸姊、集合鍵羔沙、列表鍵和有序集合鍵。
- expires 字典的鍵指向數(shù)據(jù)庫中的某個鍵厨钻, 而值則記錄了數(shù)據(jù)庫鍵的過期時間扼雏, 過期時間是一個以毫秒為單位的 UNIX 時間戳。
- Redis 使用惰性刪除和定期刪除兩種策略來刪除過期的鍵: 惰性刪除策略只在碰到過期鍵時才進(jìn)行刪除操作夯膀, 定期刪除策略則每隔一段時間诗充, 主動查找并刪除過期鍵。
- 執(zhí)行 SAVE 命令或者 BGSAVE 命令所產(chǎn)生的新 RDB 文件不會包含已經(jīng)過期的鍵诱建。
- 執(zhí)行 BGREWRITEAOF 命令所產(chǎn)生的重寫 AOF 文件不會包含已經(jīng)過期的鍵蝴蜓。
- 當(dāng)一個過期鍵被刪除之后, 服務(wù)器會追加一條 DEL 命令到現(xiàn)有 AOF 文件的末尾俺猿, 顯式地刪除過期鍵茎匠。
- 當(dāng)主服務(wù)器刪除一個過期鍵之后, 它會向所有從服務(wù)器發(fā)送一條 DEL 命令押袍, 顯式地刪除過期鍵诵冒。
- 從服務(wù)器即使發(fā)現(xiàn)過期鍵, 也不會自作主張地刪除它谊惭, 而是等待主節(jié)點發(fā)來 DEL 命令汽馋, 這種統(tǒng)一侮东、中心化的過期鍵刪除策略可以保證主從服務(wù)器數(shù)據(jù)的一致性。
- 當(dāng) Redis 命令對數(shù)據(jù)庫進(jìn)行修改之后豹芯, 服務(wù)器會根據(jù)配置悄雅, 向客戶端發(fā)送數(shù)據(jù)庫通知。