2016-01-24 33 views
0

我使用Redis的作爲客戶端的緩存機制。 用C#使用stackexchange.redis實現。 我將快照配置爲「保存5 1」並打開了rdbcompression。 每次需要添加數據時,RDB機制都會將rdb文件加載到內存中。 問題是當你有一個相當大的RDB文件,並且它一次加載到內存中。它扼殺了平均端點的內存,磁盤和CPU。Redis的快照超載內存

有沒有一種方法,而無需加載整個文件到內存空間更新RDB文件? 也歡迎任何其他解決方案降低內存和CPU的負載。

+2

這似乎是完全的服務器端;刪除SE.Redis標籤,因爲它使用什麼客戶端庫無關緊要。 –

+1

@MarcGravell這似乎完全是MSFT-fork ...你認爲應該有一個'redis-microsoft'標籤嗎? –

+0

@MarcGravell我同意Itamar。我們正在使用微軟的分支,如果你可以添加標籤,我會很高興,因爲我沒有足夠的信譽。 –

回答

0

我們使用RDB解決了這個問題,現在使用AOF完全。 我們已經通過減少自動AOF重寫百分比,並且還限制了自動AOF重寫分鐘大小到所需的大小降低存儲器峯。

3

RDB機制每次需要追加數據時都會將rdb文件加載到內存中。

這不是開源Redis的服務器執行(其它變體,如MSFT叉,行爲可能不同) - RDBS通過用叉形過程複製存儲的內容,以磁盤創建。轉儲的文件從不加載,除非用於恢復。保存過程中增加的內存使用量取決於由於寫入時複製(COW)機制而正在進行轉儲時執行的寫入數量。

此外,任何其他解決方案,降低內存和CPU的負載是值得歡迎的。

根據您的要求和預算,有幾種方法可以解決這個問題。其中包括:

  • 同時使用RDB和AOF進行數據持久性,從而減少轉儲的頻率。
  • 將持久性委託給從實例。
  • 分片數據庫和進行級聯轉儲。
+0

我們使用MSFT fork for windows。爲了更清楚一點,我們使用客戶端端點上的redis-server作爲緩存機制。我現在正在嘗試的只是使用AOF作爲持久性機制,這似乎解決了我的記憶痛苦。 但據我所知,沒有辦法限制AOF文件的大小。 有沒有辦法在被驅逐的數據和aof文件之間建立某種關聯。意思是使用lru機制驅逐的任何數據都不應該保留在磁盤上。 磁盤上的內存鏡像不會超出分配給redis的內存大小。 –