1. 程式人生 > 資料庫 >2020 12 16 關於Redis持久化的問題

2020 12 16 關於Redis持久化的問題

1、什麼是持久化?

Redis執行環境在記憶體中,如果Redis伺服器關閉,則記憶體資料將會丟失
解決方案:可以定期將記憶體資料持久化到磁碟中。
當redis正常執行時,定期的將資料儲存到磁碟中,當redis伺服器重啟時,則根據配置檔案中指定的持久化的方式,實現資料的恢復。

RDB模式

RDB模式特點說明

  1. RDB模式是redis預設的策略
  2. RDB模式能夠定期(時間間隔)持久化。弊端是可能導致資料的丟失
  3. RDB模式記錄的是記憶體資料的快照,持久化效率較高,快照只保留最新的記錄

RDB模式命令

1.save命令: 將記憶體資料持久化到磁碟中 主動的操作 會造成執行緒阻塞
2.bgsave命令: 將記憶體資料採用後臺執行的方式,持久化到檔案中. 不會造成阻塞.

3.預設的持久化的機制
save 900 1 如果在900秒內,執行了1次更新操作,則持久化一次
save 300 10 如果在300秒內,執行了10次更新操作,則持久化一次
save 60 10000 如果在60秒內,執行了10000次更新操作,則持久化一次

AOF模式

AOF模式特點

  1. AOF模式預設條件下是關閉的,需要手動開啟
  2. AOF模式記錄的是使用者的操作過程,所以可以實現實時持久化操作
  3. AOF模式由於記錄的是實時的操作過程,所以持久化檔案較大,需要定期維護

持久化操作總結

  1. 當記憶體資料允許少量丟失時,採用RDB模式(快)
  2. 當記憶體資料不允許丟失時,採用AOF模式(定期維護持久化檔案)
  3. 一般在工作中採用RDB+AOF模式共同作用,保證資料的有效性

記憶體優化策略

為什麼需要記憶體優化?
說明:由於redis在記憶體中儲存資料,如果一直儲存,則內除資料必然溢位,所以需要定期維護內除資料的大小。
維護策略:刪除舊的不用的資料,保留新的常用的資料。

那麼有哪些常用記憶體優化演算法呢?

LRU演算法

LUR 是Least Recently Used的縮寫,即最近最少使用,是一種常用的頁面置換演算法,選擇最近最久未使用的頁面予以淘汰。該演算法賦予每個頁面一個訪問欄位,用來記錄一個頁面自上次被訪問以來所經歷的時間t,當須淘汰一個頁面的時候,選擇現有頁面只其t值最大的,即最近最少使用的頁面予以淘汰。
計算維度:時間 t
注意事項:LRU演算法是迄今為止記憶體中最好用的資料置換演算法

LFU演算法

LFU(least frequently used (LFU) page-replacement algorithm)。即最不經常使用頁置換演算法,要求在頁置換引用計數最小的頁。因為經常使用的頁應該有一個比較大的引用次數。但是有些頁在開始時使用次數很多,但以後就不再使用。這類頁將會長時間留在記憶體中,因此可以將引用計數暫存器定時右移一位,形成指數衰減的平均使用次數。
維度:使用次數

隨機演算法

TTL演算法(提前刪除)

根據剩餘的存活時間,將馬上要超時的資料提前刪除

關於快取遇到的問題

由於快取失效,導致大量的使用者的請求,直接訪問資料庫伺服器。導致負載過高,從而引用整體宕機的風險

快取穿透

說明:使用者頻繁訪問資料庫中不存在的資料,可能出現快取穿透的現象。如果該操作是高併發操作,則可能直接威脅資料庫伺服器。
解決方案:

  1. 採用IP限流的方式 降低使用者訪問伺服器次數。IP動態代理(1分鐘變一次)
  2. 微服務的處理方式:利用斷路器返回執行的業務資料即可不執行資料庫操作 從而保護了資料庫
  3. 微服務的處理方式:API閘道器設計。不允許做非法操作

快取擊穿

說明:由於redis中某個熱點資料由於超時/刪除等操作造成資料失效。同時使用者高併發訪問該資料,則可能導致資料庫宕機。該操作稱之為 快取擊穿
解決方案:可以採用多級快取的設計。同時資料的超時時間採用隨機數的方式

快取雪崩

說明:由於redis記憶體資料大量失效。導致使用者的訪問命中率太低。大量的使用者直接訪問資料庫,可能導致資料庫伺服器宕機。這種現象稱之為快取雪崩
解決:

  1. 採用多級快取
  2. 設定不同的超時時間
  3. 禁止執行flushAll 等敏感操作