常用模組
阿新 • • 發佈:2020-08-01
資料型別
- String:最大512M,內容過大可以存入MonoDB或CDN快取。序列化操作。
- Hash,單個value過大可以拆分,使用multiGet獲取。可以部分更新。
- set
- zset:有序的集合,跳錶,時間複雜度O(logN)
- List:佇列
常見命令
- keys:查詢
- setnx:設定
- experie:設定過期時間(秒)
高可用
- 哨兵:監控:檢查主伺服器是否執行正常;提醒:傳送故障通知;自動故障遷移:主從切換。腦裂:配置從機數量與延遲時間。
- 叢集:資料分散儲存。一致性Hash演算法(沿著hash環順時針定位到伺服器)解決節點的動態增減問題,虛擬節點解決資料傾斜問題。
持久化策略
- RDB持久化:儲存某個時間點的全量資料快照。
- AOF持久化:儲存除了查詢以外更新資料庫狀態的指令。
同步策略
- 主從同步:初始化階段全量同步,初始化之後增量同步(可以隨時發起全量同步);
- 快照同步:將記憶體資料對映到硬碟,恢復較快。
過期策略
- 定時刪除:建立定時器
- 惰性刪除:獲取鍵時檢查鍵是否過期,過期則刪除。
- 定期刪除:每隔一段時間定期檢查,刪除過期鍵。
淘汰機制
- 所有的鍵空間/過期的鍵空間隨機移除或移除最近未使用的Key。
- LRU:最近最久未使用的淘汰演算法。
- LFU:最近最少使用的淘汰演算法。
多路IO複用
- 基於react設計模式監聽IO事件。
Redis是單執行緒還是多執行緒的
- 檔案事件處理器=多個套接字+IO複用程式+檔案事件分派器(單執行緒)+事件處理器
- Redis的瓶頸不在CPU,而在於記憶體和網路,通過搭建多個Redis例項解決。
- Redis 6.0在網路IO的處理方面上了多執行緒,核心的模組還是單執行緒的。
Redis為什麼快
- 完全基於記憶體,查詢資料的時間複雜度是O(1)
- 資料結構簡單
- 單執行緒,避免執行緒上下文切換,鎖的競爭,死鎖
- 多路複用IO,非阻塞IO
保證快取與資料庫雙寫的一致性
- Cache aside pattern:
讀
:先讀快取,再讀資料庫,更新快取;寫
:先更新資料庫,再刪除快取。 - 最初的快取不一致問題:更新資料庫,刪除快取(存在一致性問題)-->刪除快取,更新資料庫(容易產生髒資料)。
- 高併發場景:一個佇列對應一個工作執行緒,每個工作執行緒序列拿到對應的操作,然後一條一條的執行;完成資料庫的修改之後更新快取。
- 優化:可過濾多個在一起的快取更新操作;讀操作等待時間過長,直接從資料庫讀取舊的值。
快取穿透、快取擊穿、快取雪崩
- 快取穿透:快取和資料庫中都沒有的資料;解決方案:key與空值放入,設定較短的失效時間。布隆過濾器,多個無偏Hash函式得到位置。
- 快取雪崩:快取服務掛掉;解決方案:服務限流降級,多級快取,預熱。
- 快取擊穿:快取中沒有,資料庫中有;解決方案:分散式鎖,key不存在時進行set操作。