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