文章目錄
- 1. Redis 簡介
- 2. Redis 優缺點
- 3. Redis 高性能
- 4. Redis VM 機制
- 5. Redis 數據類型
- 6. 應用場景
- 7. 持久化
- 8. 過期策略
- 9. 內存相關
- 10. 線程模型
- 11. 事務
- 12. 集群
1. Redis 簡介
定義
:Redis 是一個用 C 語言編寫的高性能非關系型(NoSQL)鍵值對數據庫。數據類型
:鍵的類型只能為字符串,值支持五種數據類型:字符串(String)、列表(List)、集合(Set)、散列表(Hash)、有序集合(Zset)。存儲方式
:數據存在內存中,讀寫速度快。應用場景
:緩存、分布式鎖、事務處理、持久化、LUA腳本執行、LRU驅動事件、多種集群方案。
2. Redis 優缺點
優點
:- 讀寫快:基于內存操作和底層線程模型。
- 數據持久化:支持 AOF 和 RDB 持久化機制。
- 事務支持:Redis 操作是原子性的,支持合并后的原子性執行。
- 豐富的數據結構:除了字符串外還支持 hash、set、zset、list 等。
- 主從復制:主機會自動將數據同步到從機,可以實現讀寫分離。
- 多種集群模式。
缺點
:- 容量限制:數據庫容量受物理內存限制。
- 主從復制局限:不具備自動容錯和恢復功能,主機宕機可能導致數據不一致問題。
常見問題
:- 緩存擊穿 -> 熱點key過期,高并發請求打到數據庫 -> 設置合理的緩存失效時間
- 緩存穿透 -> 訪問不存在的key,惡意攻擊數據庫 -> 針對接口限流、針對用戶限流、使用布隆過濾器(Bloom Filter)防止穿透
- 緩存雪崩 -> 大量key集中失效,大量請求打到數據庫 -> 數據預熱、分布式部署緩存服務器
3. Redis 高性能
- 基于內存操作,類似 HashMap 的查找效率。
- 數據結構簡單,專為高效操作設計。
- 單線程模型,避免上下文切換和競爭條件。
- 使用多路 I/O 復用模型,非阻塞 IO。
- 自構建 VM 機制,優化內存使用。
4. Redis VM 機制
- 開啟 VM 功能可實現冷熱數據分離,提高訪問速度。
- 自行管理交換文件,減少IO操作,提高效率。
5. Redis 數據類型
String
:支持字符串、整數或浮點數的操作。- SDS 柔性數組對象(不限長度的char[]),記錄了已用字符串len,未用字符串free,不需要讀結尾 \0
List
:雙向鏈表,支持兩端壓入彈出元素。- quickList、zipList(數組)/listPack(鏈表)
Set
:無序集合,支持交集、并集等操作。- intset(value 為整數類型,元素少于 set-max-intset-entries 配置值時使用此結構) / dict
Zset
:有序集合,支持排序操作。- skipList(跳表)
Hash
:包含鍵值對的無序散列表。- listPack / dict -> Hashtable 擴容和漸進式 Rehash (在rehash過程中,同時使用原哈希表和新哈希表來進行鍵值對的查找和插入操作, 實現平滑的哈希表擴容,保證并發訪問,避免 rehash 過程出現大量的哈希沖突)
6. 應用場景
計數器
:利用 String 類型進行自增自減操作。緩存
:熱點數據緩存,提高讀取速度。會話緩存
:統一存儲多臺服務器會話信息。全頁緩存 (FPC)
:用于快速加載瀏覽過的頁面。查找表
:如 DNS 記錄。消息隊列
:使用 List 實現簡單的消息隊列。分布式鎖
:使用 SETNX 命令實現。- 其他應用:如排行榜、共同好友等功能。
7. 持久化
RDB
:定期快照保存,性能高但安全性較低。(BGSAVE)AOF
:記錄每次寫命令,數據安全但文件較大。
總結:通常同時使用兩種機制,優先加載 AOF 文件恢復數據。
8. 過期策略
- 定時過期:立即清除過期數據,占用 CPU 資源。
- 惰性過期:訪問時檢查是否過期,節省 CPU 資源。
- 定期過期:定期掃描并清除 expires 字典中一定數量的過期數據,平衡 CPU 和內存資源。
9. 內存相關
淘汰策略
:篩選范圍分為全局的和設置過期時間的鍵空間選擇性移除;常用算法有:當內存不足時移除最近最少使用的 key (LRU 算法)或隨機移除 key (Random 算法),還有 LFU 算法和 TTL 算法。內存優化
:使用集合類型(hash,set,zset,list)數據存儲,減少內存占用。
10. 線程模型
單 Reactor 多線程模型
:基于 Reactor 模式實現了核心組件 - 文件事件處理器:使用 I/O 多路復用監聽多個套接字, 并發送產生事件的套接字給文件事件分派器(單線程),分派器根據套接字執行的任務類型調用不同的事件處理器。事件循環(Event Loop)
:基于事件驅動的異步非阻塞的網絡通信模型,它通過監聽和處理事件來實現網絡通信和其他任務的處理, I/O 多路復用 是事件循環機制用于檢測文件描述符活動狀態的一種技術實現。
11. 事務
概念
:通過 MULTI、EXEC、WATCH 等命令實現,保證一次性、順序性、排他性地執行一系列命令。特性
:支持原子性和隔離性,但不支持回滾。Lua 腳本
:保證腳本內命令的一次性執行,同樣不提供回滾。
12. 集群
主從復制
- 讀寫分離
-
- 全量復制 - RDB;
-
- 基于長連接的命令傳播;
-
- 增量復制 - repl_backlog_buffer環形緩沖區 + master_repl_offset / slave_repl_offset
Sentinel 哨兵模式
- 實時監控 & 故障轉移 (定期PING -> 主觀下線 -> 客觀下線 -> 故障轉移,注意不是領導者下線而是主節點下線)
- Sentinel 領導者選舉 - Raft 一致性算法(候選者狀態 -> 提名和投票 -> 選舉過程[等待贊成票] -> 防止分裂 -> 領導者維持)
Cluster 模式
- 三種分片方案(客戶端分片、代理層分片以及 Redis Cluster - 解決橫向擴展問題)
- Redis Cluster 方案:一致性哈希 分片,Gossip 協議 信息交換
- 節點通信與故障檢測
- 主從復制
- 數據遷移
- 客戶端路由