2020 12 16 關於Redis持久化的問題
1、什麼是持久化?
Redis執行環境在記憶體中,如果Redis伺服器關閉,則記憶體資料將會丟失
解決方案:可以定期將記憶體資料持久化到磁碟中。
當redis正常執行時,定期的將資料儲存到磁碟中,當redis伺服器重啟時,則根據配置檔案中指定的持久化的方式,實現資料的恢復。
RDB模式
RDB模式特點說明
- RDB模式是redis預設的策略
- RDB模式能夠定期(時間間隔)持久化。弊端是可能導致資料的丟失
- RDB模式記錄的是記憶體資料的快照,持久化效率較高,快照只保留最新的記錄
RDB模式命令
1.save命令: 將記憶體資料持久化到磁碟中 主動的操作 會造成執行緒阻塞
2.bgsave命令: 將記憶體資料採用後臺執行的方式,持久化到檔案中. 不會造成阻塞.
save 900 1 如果在900秒內,執行了1次更新操作,則持久化一次
save 300 10 如果在300秒內,執行了10次更新操作,則持久化一次
save 60 10000 如果在60秒內,執行了10000次更新操作,則持久化一次
AOF模式
AOF模式特點
- AOF模式預設條件下是關閉的,需要手動開啟
- AOF模式記錄的是使用者的操作過程,所以可以實現實時持久化操作
- AOF模式由於記錄的是實時的操作過程,所以持久化檔案較大,需要定期維護
持久化操作總結
- 當記憶體資料允許少量丟失時,採用RDB模式(快)
- 當記憶體資料不允許丟失時,採用AOF模式(定期維護持久化檔案)
- 一般在工作中採用RDB+AOF模式共同作用,保證資料的有效性
記憶體優化策略
為什麼需要記憶體優化?
說明:由於redis在記憶體中儲存資料,如果一直儲存,則內除資料必然溢位,所以需要定期維護內除資料的大小。
維護策略:刪除舊的不用的資料,保留新的常用的資料。
那麼有哪些常用記憶體優化演算法呢?
LRU演算法
LUR 是Least Recently Used的縮寫,即最近最少使用,是一種常用的頁面置換演算法,選擇最近最久未使用的頁面予以淘汰。該演算法賦予每個頁面一個訪問欄位,用來記錄一個頁面自上次被訪問以來所經歷的時間t,當須淘汰一個頁面的時候,選擇現有頁面只其t值最大的,即最近最少使用的頁面予以淘汰。
計算維度:時間 t
注意事項:LRU演算法是迄今為止記憶體中最好用的資料置換演算法
LFU演算法
LFU(least frequently used (LFU) page-replacement algorithm)。即最不經常使用頁置換演算法,要求在頁置換引用計數最小的頁。因為經常使用的頁應該有一個比較大的引用次數。但是有些頁在開始時使用次數很多,但以後就不再使用。這類頁將會長時間留在記憶體中,因此可以將引用計數暫存器定時右移一位,形成指數衰減的平均使用次數。
維度:使用次數
隨機演算法
TTL演算法(提前刪除)
根據剩餘的存活時間,將馬上要超時的資料提前刪除
關於快取遇到的問題
由於快取失效,導致大量的使用者的請求,直接訪問資料庫伺服器。導致負載過高,從而引用整體宕機的風險
快取穿透
說明:使用者頻繁訪問資料庫中不存在的資料,可能出現快取穿透的現象。如果該操作是高併發操作,則可能直接威脅資料庫伺服器。
解決方案:
- 採用IP限流的方式 降低使用者訪問伺服器次數。IP動態代理(1分鐘變一次)
- 微服務的處理方式:利用斷路器返回執行的業務資料即可不執行資料庫操作 從而保護了資料庫
- 微服務的處理方式:API閘道器設計。不允許做非法操作
快取擊穿
說明:由於redis中某個熱點資料由於超時/刪除等操作造成資料失效。同時使用者高併發訪問該資料,則可能導致資料庫宕機。該操作稱之為 快取擊穿
解決方案:可以採用多級快取的設計。同時資料的超時時間採用隨機數的方式
快取雪崩
說明:由於redis記憶體資料大量失效。導致使用者的訪問命中率太低。大量的使用者直接訪問資料庫,可能導致資料庫伺服器宕機。這種現象稱之為快取雪崩
解決:
- 採用多級快取
- 設定不同的超時時間
- 禁止執行flushAll 等敏感操作