1. 程式人生 > >《Redis官方教程》-FAQ

《Redis官方教程》-FAQ

原文連結   譯者:Alexandar Mahone  校對:方騰飛(紅體標記重點)

為什麼Redis不同於其他的鍵值儲存資料庫?

有兩個主要原因:

  • Redis發展方向不同與其他鍵值資料庫,它能包含很多複雜資料型別,對這些資料型別操作都是原子的。Redis資料型別與基本資料結構強相關,直接暴露給程式設計師,沒有增加抽象層。
  • Redis是一個記憶體資料庫,而不是持久化在硬碟資料庫中,因此為了實現高速讀寫,資料集大小不能超過記憶體。記憶體資料庫另一個優點是,記憶體資料庫相對於硬碟資料庫非常容易操作複雜資料結構,因此Redis的可以做很多事情,很少有內部的複雜性。與此同時兩款磁碟儲存格式(RDB和AOF)不需要支援隨機訪問,因此他們是緊湊的,而且總是以追加形式生成(甚至AOF日誌輪換也是一個追加操作,因為新版本是由記憶體中的副本生成)。

Redis記憶體使用情況?

舉幾個例子(所有資料基於64位例項)

  • 一個空例項大約佔用1M記憶體
  • 1百萬簡單字串鍵值對大約佔用100M記憶體
  • 1百萬雜湊表鍵值對,每個物件有5個屬性,大約佔用200M記憶體

為了測試你的用例,使用redis-benchmark工具生成隨機資料集,使用INFO memory命令檢查使用記憶體空間。

儲存相同的鍵,64位系統比32位系統使用更多的記憶體,鍵值很小情況下更明顯。這是因為64位系統指標佔用8位元組。但是64位系統優點是可以配置更多記憶體(校對注:32位作業系統支援的記憶體最多為2的32次方,就是4G),因此為了執行大型Redis伺服器,64位系統或多或少都是需要的

。另一種方案是使用分片。

我喜歡Redis的高效能操作和特性,但是不喜歡所有內容都在記憶體中,我不能建立一個比記憶體更大資料集。有計劃改變嗎?

過去為了允許資料集超過RAM大小,Redis開發人員嘗試使用虛擬記憶體和其他系統,但是我們非常高興可以把一件事情做好:資料服務由記憶體提供,磁碟用於儲存資料。所以現在沒有計劃為Redis建立磁碟後端,畢竟Redis大部分特性都是基於其當前架構設計的。

你的真正問題並不是所需的總記憶體,而是你需要劃分你的資料集到多個Redis例項上,為了獲取更多資訊請閱讀本文件中的分割槽頁面

同時使用Redis和磁碟資料庫,是不是一個好想法?

是的,一個通用的設計方案是,在非常頻繁的寫小的資料時採用Redis

(並且你需要使用Redis資料結構給你的問題建立高效模型),以及將大資料儲存到SQL資料庫或者最終一致性磁碟資料庫中

有沒有方法降低Redis記憶體使用率?

如果可以的話使用Redis 32位例項。另外,還要善於使用雜湊表,列表,有序集合和整數集,因為在特殊情況下Redis使用這些資料型別可以更緊湊儲存一些元素。可以在記憶體優化頁面獲取更多資訊。

Redis記憶體不足時會發生什麼?

Redis要麼被Linux核心OOM殺掉,丟擲錯誤崩潰,要麼開始變得卡頓。隨著現代作業系統malloc方法通常都不返回NULL,而是伺服器開始交換,因此Redis效能降低,因此你可能會觀察到一些錯誤現象。

INFO命令返回Redis使用記憶體總量,因此你可以編寫指令碼監控Redis伺服器記憶體臨界值。

Redis內建保護措施允許使用者在配置檔案中使用maxmemory選項,設定Redis最大佔用記憶體。如果達到此限制,Redis將開始返回錯誤給寫命令(但是將繼續接受只讀命令),或者當最大記憶體限制達到時也可以配置為驅逐鍵,在這種情況下Redis作為快取使用。

在Linux系統中,即使我有很多空閒記憶體,後臺儲存失敗報fork錯誤!

精闢答案:echo 1 > /proc/sys/vm/overcommit_memory