Redis中內存溢出問題和持久化方法

1、內存溢出問題

解決辦法

1. 設置key的過時時間

2. 按需求使用8種數據淘汰策略

  1. volatile-lru(Least Recently Used):從已設置過時時間的數據集中挑選最近最少使用的數據淘汰
  2. volatile-lfu(Least Frequently Used):從已設置過時時間的數據集中挑選一段時間內使用頻率最少的數據淘汰
  3. volatile-ttl(Time To Live):從已設置過時時間的數據集中挑選將要過時的數據淘汰
  4. volatile-random:從已設置過時時間的數據集中隨機選擇數據淘汰
  5. allkeys-lru:從數據集中挑選最近最少使用的數據淘汰
  6. allkeys-lfu:從全部Keys中挑選一段時間內使用頻率最低的數據淘汰
  7. allkeys-random:從數據集中隨機選擇數據淘汰
  8. no-envicition(驅逐):禁止驅逐數據,針對寫操做,返回錯誤信息(不採用任何淘汰策略,默認即此配置)

2、持久化方法

方式一:RDB

簡介

  • RDB:Redis Database(默認持久化機制,默認文件名dump.rdb)
  • 有兩個功能函數rdbSave(生成RDB文件)和rdbLoad(從文件加載到內存)

優勢

  1. 快照保存數據極快,還原數據極快
  2. 適用於災難備份

缺點

  1. 小內存及其不適合使用
  2. 符合快照條件纔會進行快照,意外宕機會丟失最後一次快照後的全部修改

快照條件

  1. Redis服務器正常關閉:./bin/redis-cli shutdown
  2. 配置文件中設置的條件
    • save 900 1 //每900秒(15分鐘)至少1個key發生變化,產生快照
    • save 300 10 //每300秒(5分鐘)至少10個key發生變化,產生快照
    • save 60 10000 //每60秒(1分鐘)至少10000個key發生變化,產生快照

方式二:AOF

原理簡介

  1. redis會將每個收到的命令都經過write函數追加到文件中(默認是appendonly.aof), 當redis重啓時會經過從新執行文件中保存的「寫命令」來在內存中重建整個redis數據庫中的內容

2. 每當執行服務器(定時)任務或者函數時flushAppendOnlyFile 函數都會被調用, 這個函數執行如下兩個工做:

  • WRITE:根據條件,將 aof_buf 中的緩存寫入到 AOF 文件
  • SAVE:根據條件,調用 fsync 或 fdatasync 函數,將 AOF 文件保存到磁盤中

優勢

持久化比RDB更好,不會丟失任何的修改redis

缺點

  • 持久化文件會變的愈來愈大
  • 重複命令不少(例如:調用100次 「incr dcl" 命令,則文件中必須保存100條「incr dcl"命令記錄,可是其中的99條記錄都是重複的)

PS:數據庫

  1. 文章來自各類資源的整理,若有侵權請告知刪除。
  2. 轉載本文請註明出處
相關文章
相關標籤/搜索