目錄
一、Redis概念
1.1 Redis定義
1.2 Redis的特點
1.3 Redis的用途
1.4?Redis與其他數據庫的對比
二、Redis數據庫
三、Redis五個基本類型
3.1 字符串
3.2 列表(list) ——可以有相同的值
3.3 集合(set) ——值不能重復
3.4 哈希(hash) ——類似于Map集合
3.5 有序集合(zset) ——不能重復
四、事務
4.1 事務定義
4.2 與mysql的事務的區別
4.3 代碼解釋?
五、樂觀鎖和悲觀鎖?
5.1 樂觀鎖
5.2 悲觀鎖
5.3?樂觀鎖與悲觀鎖的區別和適用場景
六、Redis持久化?
6.1 定義
6.2 兩種方式
(1)RDB
(2)AOF
七、主從復制
7.1 概念
7.2 模式
(1)一個主機有兩個從機
(2)鏈路模式
八、哨兵模式
8.1 概念
8.2 優缺點
九、緩存穿透、擊穿和雪崩
1.緩存穿透——查不到
2.緩存擊穿——量太大,緩存過期
3.緩存雪崩
一、Redis概念
1.1 Redis定義
????????Redis(Remote Dictionary Server)是一個開源的、基于內存的數據結構存儲系統,通常用作數據庫、緩存或消息代理。它支持多種數據結構,如字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等,并提供豐富的操作命令。
1.2 Redis的特點
- 高性能:數據存儲在內存中,讀寫速度極快,適合高并發場景。
- 持久化:支持RDB(快照)和AOF(日志)兩種持久化機制,確保數據安全。
- 數據結構豐富:支持多種數據結構,滿足不同業務需求。
- 原子操作:所有操作是原子性的,適合分布式鎖等場景。
- 擴展性:支持主從復制、分片(集群)等功能。
1.3 Redis的用途
- 緩存:加速數據訪問,減輕后端數據庫壓力。
- 會話存儲:存儲用戶會話信息,支持分布式系統。
- 消息隊列:利用列表或發布/訂閱模式實現消息傳遞。
- 實時排行榜:使用有序集合實現實時排名功能。
- 地理空間索引:支持存儲和查詢地理位置數據。
1.4?Redis與其他數據庫的對比
- 與關系型數據庫(如MySQL):Redis基于內存,適合高速讀寫;關系型數據庫適合復雜查詢和事務。
- 與Memcached:Redis支持更多數據結構和持久化,Memcached更簡單,僅支持鍵值存儲。
二、Redis數據庫
1.Redis有16個(0-15)數據庫,默認使用0號數據庫。
2.Redis數據庫的有關操作
三、Redis五個基本類型
3.1 字符串
(1)特點
最基本數據類型,可以存儲文本或二進制數據。
(2)常用的操作
(3)使用場景
①計數器
②統計多個單位數量
③對象緩存存儲
3.2 列表(list) ——可以有相同的值
(1)定義
有序的字符串列表,可以在表頭或表尾推入或彈出元素(隊列或棧結構)。
支持隊列(先進先出)和棧(后進先出)的操作。
(2)常用命令
(3)使用場景
①消息隊列
②任務調度
3.3 集合(set) ——值不能重復
(1)定義
無序唯一元素的集合。
(2)常見命令
(3)使用場景
可以實現差集、交集、并集。
3.4 哈希(hash) ——類似于Map集合
(1)定義
用于存儲鍵值對的集合。
(2)常用命令
(3)使用場景
需要頻繁訪問和更新某個實體的多個字段的場景。
3.5 有序集合(zset) ——不能重復
(1)常用命令
(2)使用場景
應用于排行榜、優先隊列等場景。
四、事務
4.1 事務定義
是一組命令的集合,不保證原子性。
4.2 與mysql的事務的區別
mysql事務:支持完整的ACID事務,保證所有操作要么全部成功,要么全部失敗。
區別:redis事務不支持隔離級別,也不支持回滾。
4.3 代碼解釋?
注意:
①如果編譯出錯,則exec執行不成功,所有命令均不會執行。
②運行時錯誤,其他命令仍可以執行,只是在出錯的地方拋出異常。
五、樂觀鎖和悲觀鎖?
5.1 樂觀鎖
(1)定義:假設沖突很少發生,操作過程中不鎖定資源,只在提交時檢測沖突。檢測是否修改過數據,如果有修改,則放棄修改,不提交。
(2)使用場景:沖突較少、讀多寫少的場景(讀取遠多于寫入的場景)
5.2 悲觀鎖
(1)定義:假設沖突總是會發生,操作前就鎖定資源,直到操作結束再解鎖
(2)使用場景:需要極強一致性、沖突頻繁的場景(金融交易、多寫操作)
5.3?樂觀鎖與悲觀鎖的區別和適用場景
實現方式差異:
????????樂觀鎖通常通過版本號(Version)或時間戳實現。例如數據庫表中增加version
字段,更新時檢查版本是否一致:
UPDATE table SET column = new_value, version = version + 1 WHERE id = ? AND version = old_version
????????悲觀鎖依賴數據庫或編程語言提供的鎖機制,如:數據庫:SELECT FOR UPDATE
性能對比:
????????樂觀鎖在低沖突場景下性能更高,因為無需加鎖和解鎖,減少了線程阻塞的開銷。
????????悲觀鎖在高沖突場景中更穩定,但加鎖會導致線程阻塞,可能引發死鎖或性能下降。
適用場景:
樂觀鎖適合:
讀多寫少的場景(如熱點數據緩存更新)
沖突概率較低的業務(如用戶信息修改)
需要高吞吐量的系統(如電商庫存扣減)
悲觀鎖適合:
寫多讀少的場景(如銀行轉賬)
關鍵數據的強一致性要求(如訂單狀態變更)
短事務且沖突概率高的操作
優缺點總結:
樂觀鎖優點:
無阻塞,并發性能高
避免死鎖問題
適合分布式環境
樂觀鎖缺點:
沖突頻繁時重試成本高
需處理業務邏輯的回滾
悲觀鎖優點:
保證強一致性
實現簡單
悲觀鎖缺點:
線程阻塞影響性能
可能引發死鎖
不適合分布式系統
六、Redis持久化?
6.1 定義
將內存中的數據保存到磁盤中。
6.2 兩種方式
(1)RDB
①原理:通過fork創建一個子進程,子進程將內存的內容寫入到一個臨時文件,持久化過程結束,把臨時文件替換上一次持久化好的文件。(但要注意:整個過程中,主進程不進行任何IO操作)。
②優點:適合大規模數據恢復;對數據完整性要求不高。
③缺點:fork進程會占用一定的空間;需要一定的時間間隔操作,如果redis意外宕機,最后一次持久化后的數據就沒有。
(2)AOF
①原理:將所有命令記錄下來,恢復時將所有命令執行一遍。
②優點:每修改一次,都會同步,文件完整性比較好。
③缺點:AOF數據文件大,修復速度慢,運行效率低。
七、主從復制
7.1 概念
????????將一個Redis服務器數據復制(數據復制是單向的)到其他服務器,前者稱為主節點,后者稱為從節點。主機負責寫數據,從機讀數據。(注意:從機不能寫數據,從機將主機中的數據備份,同步主機數據)
7.2 模式
(1)一個主機有兩個從機
(2)鏈路模式
八、哨兵模式
8.1 概念
????????Redis哨兵(Sentinel)是Redis官方提供的高可用性解決方案,用于監控和管理Redis主從集群。哨兵模式的核心功能包括:自動故障檢測、主從切換(failover)、配置更新和通知。哨兵通過心跳機制監測主節點和從節點的健康狀態,當主節點故障時,哨兵會自動選舉一個從節點晉升為新的主節點,并更新其他從節點的配置。
? ? ? ? 簡而言之:哨兵監測主機是否宕機,如果宕機則進行“投票”選舉新的主節點,自動切換新主機。
8.2 優缺點
優點:
高可用性:自動故障轉移機制確保主節點故障時服務不中斷,提升系統容錯能力。
自動化運維:無需人工干預即可完成主從切換和配置更新,降低運維成本。
監控與告警:哨兵持續監控節點狀態,支持通過API或通知機制推送故障事件。
兼容性:與Redis主從復制無縫集成,無需修改客戶端代碼即可使用。
腦裂問題:網絡分區可能導致多個主節點同時存在(split-brain),需額外配置解決(如min-slaves-to-write
)。
性能開銷:哨兵進程本身需要資源,且故障轉移期間可能存在短暫服務不可用。
配置復雜度:需部署多個哨兵節點(建議至少3個)以避免單點故障,配置和管理較復雜。
客戶端適配:部分舊版客戶端可能不支持哨兵協議,需升級或使用代理(如Twemproxy)。
九、緩存穿透、擊穿和雪崩
1.緩存穿透——查不到
(1)定義
????????客戶端查詢要查詢數據,但發現Redis(緩存)中沒有,向持久層數據庫發起查詢,數據庫中也沒有該數據,多次重復,會給持久層數據庫造成較大的壓力。
(2)解決辦法
????????①布隆過濾器
????????②緩存空對象
2.緩存擊穿——量太大,緩存過期
(1)定義
????????對于熱點數據,存在大量的并發,當熱點數據消失時,持續并發穿破緩存,直接請求數據庫,導致數據庫瞬間壓力大。
(2)解決辦法
????????①互斥鎖
????????②熱點數據不過期
3.緩存雪崩
(1)定義
????????緩存集中過期/Redis宕機
(2)解決辦法
????????①限流降級
????????②數據預熱
????????③Redis高可用