1. 程式人生 > 實用技巧 >常用模組

常用模組

資料型別

  • 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操作。