1. 伺服器中資料庫結構 Redis 伺服器將所有資料庫都保存在伺服器狀態 redisServer 結構的 db 數組中,由 redisDb 結構代表一個資料庫 Redis 伺服器預設會創建16個資料庫,預設情況下,Redis客戶端的目標資料庫是0號資料庫。 2. 切換資料庫 SELECT 命令用來 ...
1. 伺服器中資料庫結構
Redis 伺服器將所有資料庫都保存在伺服器狀態 redisServer 結構的 db 數組中,由 redisDb 結構代表一個資料庫
struct redisServer {
// ...
// 一個數組,保存著伺服器中的所有資料庫
redisDb *db;
}
Redis 伺服器預設會創建16個資料庫,預設情況下,Redis客戶端的目標資料庫是0號資料庫。
2. 切換資料庫
SELECT 命令用來切換資料庫
redis> SELECT 2
OK
redis[2]> //切換到了2號資料庫
註意:
在執行Redis命令,特別是像FLUSHDB這樣的危險命令之前,最好先執行一個SELECT命令,顯示的切換到指定的資料庫,然後在執行別的命名。
3. 資料庫鍵空間
Redis是一個鍵值對資料庫伺服器,伺服器中的每個資料庫都由一個redisDb結構表示。其中,redisDb結構的dict字典保存了資料庫中所有鍵值對,我們將這個字典稱為鍵空間。
typedef struct redisDb {
// ...
// 資料庫鍵空間,保存著資料庫中所有的鍵值對
dict *dict;
} redisDb;
- 鍵空間的鍵也就是資料庫的鍵,每個鍵都是一個字元串對象
- 鍵空間的值也就是資料庫的值,每個值可以是字元串對象、列表對象、哈希表對象、集合對象和有序集合對象中的任意一種Redis對象。
4. 鍵過期
4.0 保存過期時間
reidsDb結構的expires字典保存了資料庫中所有鍵的過期時間,我們稱這個字典為過期字典:
- 過期字典的鍵是一個指針,這個指針指向鍵空間中的某個鍵對象(也即某個資料庫鍵,不用再次創建相同的鍵對象,節省記憶體)
- 過期字典的值是一個 long long 類型的整數,這個整數保存了鍵所指向的資料庫鍵的過期時間——一個毫秒精度的UNIX時間戳。
typedef struct redisDb {
// ...
// 過期字典,保存著鍵的過期時間
dict *expires;
// ...
} redisDb;
4.1 設置鍵過期命令
Redis有四個不同的命令用於設置鍵的生存時間或者過期時間
- EXPIRE <key> <ttl> 命令用於將鍵key的生存時間設置為ttl秒
- PEXPIRE <key> <ttl> 命令用於將鍵key的生存時間設置為ttl毫秒
- EXPIREAT <key> <timestamp> 命令用於將鍵key的過期時間設置為timestamp所指定的秒數時間戳
- PEXPIREAT <key> <timestamp> 命令用於將鍵key的過期時間設置為timestamp所指定的毫秒數時間戳
EXPIRE、PEXPIRE、EXPIREAT 三個命令都是調用PEXPIREAT命令來實現的。
4.2 移除鍵過期命令
- PERSIST <key>命令用於移除鍵key的過期時間
redis>EXPIRE msg 1000 // 設置鍵msg1000秒後過期
1
redis>TTL msg
996
redis>PERSIST msg
1
redis>TTL msg
-1 // 返回值為-1,說明msg沒有設定過期時間
4.3 計算並返回剩餘生存時間
- TTL命令以秒為單位返回鍵的剩餘生存時間
- PTTL命令以毫秒為單位返回鍵的剩餘生存時間
4.4 過期鍵的刪除策略
4.4.1三種不同的刪除策略:
- 定時刪除:在設置鍵過期時間的同時創建一個定時器,讓定時器在鍵的過期時間來臨時,立即執行鍵的刪除操作
- 惰性刪除:獲取鍵時,執行刪除操作
- 定期刪除:每隔一段時間,程式就對資料庫進行一次檢查,刪除裡邊的過期鍵
4.4.2 三種刪除策略比較
- 定時刪除:對記憶體友好,通過定時器保證過期鍵儘快刪除並釋放記憶體;對CPU不友好,當過期鍵比較多時,占用大量CPU時間,影響redis伺服器的響應時間和吞吐量
- 惰性刪除:對CPU友好,程式只會在取出鍵時才會進行過期檢查;對記憶體不友好,如果有大量過期鍵且這些過期鍵有不會用到的話,記憶體永遠得不到釋放,造成記憶體浪費,可以看做一種記憶體泄漏。
- 定期刪除:是定時刪除和惰性刪除的一種折中,不過必鬚根據實際情況,合理設置刪除操作的執行時長和執行頻率
4.4.3 Redis選用的刪除策略
Redis伺服器使用惰性刪除和定期刪除兩種策略相結合的方式,通過這種方式來合理使用CPU和避免浪費記憶體。
4.5 AOF、RDB和複製功能對過期鍵的處理
4.5.1 生成RDB文件
在執行SAVE或者BGSAVE命令生成一個新的RDB文件時,程式會對資料庫中的鍵進行檢查,已過期的鍵不會被保存到新創建的RDB文件中,所以資料庫中的過期鍵不會對新的RDB文件造成影響。
4.5.2 載入RDB文件
- 如果伺服器以主伺服器模式運行,那麼載入RDB文件時,會對文件中保存的鍵進行檢查,未過期的鍵不會被載入到資料庫中
- 如果伺服器以從伺服器模式運行,那麼載入RDB文件時,不論鍵過期與否,全部載入到資料庫中
4.5.3 AOF文件寫入
當伺服器以AOF持久化模式運行時,如果資料庫中的某個鍵已經過期,但還沒有被刪除,那麼AOF文件寫入不會因為這個鍵過期受到影響。
當鍵被惰性刪除或者定期刪除後,程式會向AOF文件追加一條 DEL 命令,來顯式地記錄該鍵已經被刪除。
4.5.4 AOF 重寫
在執行 AOF 重寫時,已過期的鍵不會被保存到重寫後的AOF文件中
4.5.5 複製
當伺服器運行在複製模式下,從伺服器的過期鍵刪除動作由主伺服器控制:
- 主伺服器在刪除一個鍵後,會顯式的向所有從伺服器發送一個 DEL 命令,告知從伺服器刪除這個過期鍵
- 從伺服器在執行客戶端發送的讀命令時,即使碰到過期鍵也不會將過期鍵刪除,而是繼續像處理未過期的鍵一樣來處理過期鍵
- 從伺服器接收到主伺服器發送來的DEL命令後,才會刪除過期鍵