?Redis是什么?
Redis(Remote Dictionary?Server)是一個開源的、基于內存的鍵值數據庫,支持多種數據結構,可用作數據庫、緩存和消息中間件。主要特點包括:
- 基于內存操作,讀寫性能極高
- 支持持久化,可將內存數據保存到磁盤
- 支持主從復制和高可用集群
- 提供豐富的數據結構和操作命令
Redis為什么這么快?
- 內存操作:數據存儲在內存中,訪問速度比磁盤快幾個數量級
- 單線程模型:避免多線程上下文切換和鎖競爭
- IO多路復用:使用epoll/kqueue等機制實現高效網絡通信
- 高效數據結構:專門優化的數據結構實現(如SDS、跳躍表等)
- 單線程模型也造成cpu不能充分利用
Redis數據結構
1. 五種基本數據類型及使用場景
數據類型 | 特點 | 使用場景 |
---|---|---|
String | 二進制安全,最大512MB | 緩存、計數器、分布式鎖 |
List | 雙向鏈表,元素可重復 | 消息隊列、最新消息排行 |
Hash | 鍵值對集合 | 存儲對象、購物車 |
Set | 無序唯一集合 | 標簽、共同好友 |
ZSet | 有序集合(帶分數) | 排行榜、延時隊列 |
2. 特殊數據類型
- BitMap:二值統計(簽到、在線狀態)
- HyperLogLog:基數統計(UV統計)
- GEO:地理位置(附近的人)
- Stream:消息流(替代Kafka)
3. 底層數據結構實現
String:SDS(簡單動態字符串),支持動態擴容和二進制安全
List:3.2版本前使用ziplist或linkedlist,3.2后統一使用quicklist
Hash:ziplist(元素少時)或hashtable
Set:intset(整數集合)或hashtable
ZSet:ziplist或skiplist+dict組合
三、Redis持久化機制
1. RDB與AOF對比
維度 | RDB | AOF |
---|---|---|
原理 | 定時快照 | 記錄寫操作日志 |
性能 | 高(二進制壓縮) | 較低(文本追加) |
恢復速度 | 快 | 慢(需重放命令) |
數據完整性 | 可能丟失最后一次快照后的數據 | 更可靠 |
文件大小 | 小 | 大 |
四、Redis高可用架構
1. 主從復制
- 作用:數據冗余、讀寫分離、故障恢復
- 同步過程:
- 全量同步:從節點初次連接時,主節點生成RDB發送給從節點
- 增量同步:主節點將寫命令發送給從節點
2. 哨兵模式(Sentinel)
是一種用于構建高可用性 Redis 集群的解決方案。它通過監控 Redis 實例的狀態并自動進行故障轉移,提供了客戶端重定向機制以確保應用程序可以正常訪問 Redis
- 功能:監控、自動故障轉移、配置中心
3. Redis Cluster
- 數據分片:16384個slot,每個節點負責部分slot
- 優點:支持海量數據存儲和高并發寫
- 限制:不支持跨slot事務,多key操作需使用hash tag
五、Redis緩存問題與解決方案
1. 緩存穿透
現象:查詢不存在的數據,繞過緩存直接訪問數據庫
解決方案:
布隆過濾器攔截
緩存空對象(設置短過期時間)
對業務參數進行校驗,不合法的值直接返回
2. 緩存擊穿
現象:熱點key過期瞬間,大量請求直接訪問數據庫
解決方案:
互斥鎖(如Redis分布式鎖)
熱點數據永不過期
3. 緩存雪崩
現象:大量key同時過期,導致請求直接訪問數據庫
解決方案:
設置隨機過期時間,均勻分布key的失效時間
多級緩存
熔斷降級機制
六、Redis內存管理
1. 過期鍵刪除策略
- 惰性刪除:訪問時檢查是否過期,過期則刪除
- 定期刪除:定時隨機檢查并刪除過期鍵
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
? ? ? ? ? ? ? ? ? ? ? ??
原文鏈接:https://blog.csdn.net/weixin_47242663/article/details/149520081