Redis是用C語言開發的一個開源的高性能鍵值對(key-value)內存數據庫。
Redis數據存儲原理
** 存儲結構如圖:**
redisDB、dict、dictht、dictEntry、RedisObject的存儲結構關系如圖:
占的字節數:
dictEntry :16字節、RedisObject:12字節、sds:8字節 + 字符串長度
我們現在思考,如果一個10字節的key,需要多少存儲空間呢?
16+12+8+10+1=47*2(exprires也需要同樣的空間所以乘以倍數)
結論:在key設置的時候盡量的少的字節,避免空間的浪費;
內存清理方式:
-
定期清理
隨機取樣的方式,如果清理的比例大于25%,繼續。如下圖:
-
惰性刪除:被動刪除策略,訪問時判斷;
-
LFU
volatile-lfu:對有過期時間的key采用LFU淘汰算法;
allkeys-lfu:對全部key采用LFU淘汰算法; -
LRU
volatile-lru:從設置了過期時間的數據集中,選擇最近最久未使用的數據釋放;
allkeys-lru:從數據集中選擇最近最久未使用的數據釋放;
Redis數據固化方式
-
RDB快照方式
手動方式: save:阻塞當前Redis服務器,直到RDB過程完成為止; 自動方式: bgsave:fork子進程,持久化過程由子進程負責,完成后自動結束; 配置項:save m n,m秒存在n次寫入,觸發bgsave ;
優點:
對Redis性能影響低,二進制壓縮文件體積小,數據恢復塊;
** 缺點:**
有數據丟失可能,備份文件版本兼容問題;
** 過程如圖:**
* AOF快照方式 :
append only file,日志形式記錄寫入指令,實時持久化;**命令寫入過程:**
配置 | 含義 | 效率 | 數據安全 |
---|---|---|---|
appendfsync=always | 每次同步 | 低 | 全最高,最多丟失一個寫入的數據 |
appendfsync=everysec | 每秒同步 | 中 | 安全最折中,最多丟失1S的數據 |
appendfsync=no | 關 閉 | 高 | 安全最低,最多上一次保存AOF文件到當前時刻的全部數據 |
- AOF文件重寫
- fork子進程不影響父進程處理請求
- 子進程雙寫,確保數據不丟失
- 手動觸發:調用bgrewriteaof命令
- 被動觸發:
- auto-aof-rewrite-min-size
- auto-aof-rewrite-percentage
- aof_current_size
- aof_base_size
過程如圖:
Redis重啟恢復過程:
注意:重啟的過程中需要注意:如果開啟RDB模型,未開啟AOF模式,而在重啟的時候開啟AOF模式,這是RDB****的數據就會覆蓋掉。
Redis可靠性保障
- 主從模式
啟動時,全量同步Slave。增量同步,運行ID(Master啟動時生成),同步給Slave,通過復制偏移量確定具體同步位置;
具體同步過程如下圖所示:
哨兵模式架構:
-
集群模式
無需Sentinel哨兵,支持水平擴容,自動遷移。
缺點:
不支持批量操作,客戶端路由,兩次交互,存在性能問題,如圖:
-
C語言
+關注
關注
180文章
7604瀏覽量
136692 -
數據存儲
+關注
關注
5文章
970瀏覽量
50894 -
數據庫
+關注
關注
7文章
3794瀏覽量
64362
發布評論請先 登錄
相關推薦
評論