《Redis官方教程》 FAQ

2021-09-23 16:31:34 字數 2626 閱讀 6993

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

有兩個主要原因:

redis記憶體使用情況?

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

為了測試你的用例,使用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作為快取使用。

我們有文件描述redis作為lru快取使用。

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

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

詳細回答:

overcommit_memory設定為1,意味著linux 使用更樂觀方式fork,這確實是你所期望的redis。

「理解虛擬機器記憶體 (校對注:有興趣可以翻譯此文在併發網發表)」是紅帽經典文章,可以了解linux虛擬記憶體怎麼工作,overcommit_memory和overcommit_ratio的替代品。這篇文章校正了proc(5)使用者手冊對overcommit_memory1和2配置正確含義。

redis磁碟快照是不是原子操作?

是的,當伺服器不在執行命令時,redis後台儲存程序總是被建立,因此每個命令在ram中是原子的,並且在磁碟快照過程也是原子的。

redis是單執行緒的,我怎麼利用多cpu/核?

cpu基本不可能成為的redis的瓶頸,因為通常redis受限於記憶體或網路。例如使用pipelining,redis執行在普通的linux系統上,每秒可以處理50萬請求,所以如果你的應用程式主要使用o(n) 或者 o(log(n))命令,幾乎不會使用太多的cpu。

然而為了最大限度利用cpu,你可以在一台機器上啟動多個redis例項,並把它們設定為不同伺服器。某些時候單個機器是不夠的,所以如果你想使用多個cpu,你可以提前考慮使用分片。

關於使用多redis例項,你可以在partitioning page找到更多的資訊

單個redis例項最多可以儲存多少鍵?雜湊表、列表、集合和有序集合最大可以包含多少元素?

redis最大可以處理2^32鍵,實踐測試每個例項最少可以處理2.5億鍵。

每個雜湊表、列表、集合和有序集合可以容納2^32元素。

換句話說,redis極限容量就是系統可用記憶體。

為什麼我的從例項與主例項擁有不同數量鍵?

如果你使用有生存週期的鍵,這就是正常現象。這就導致主從例項鍵的數量不一致原因。

為很多鍵設定過期屬性,通常為使用者提供了在從例項上儲存更少鍵,但是實際上例項內容沒有邏輯區別。

redis實際含義是什麼?

redis是遠端資料字典伺服器(remote dictionary server)。

你為什麼啟動redis專案?

最初啟動redis,是為了擴大lloogg。但是當我完成了基本服務端工作後,我喜歡把這個想法分享給其他人,然後redis轉變成開源專案。

Apache Storm 官方文件 FAQ

worker 的完整數量是由 supervisor 配置的。每個 supervisor 會分配到一定數量的 jvm slot,你在拓撲中設定的 worker number 就是以這個 slot 數量為依據進行分配的。不建議為每個拓撲在每台機器上分配超過乙個 worker。假如有乙個執行於三颱 8 核...

《Redis官方教程》 事件庫

讓我們通過一系列q a來弄明白。q 你期望網路伺服器都做些什麼事情?a 在它監聽的埠上等待連線的到來,然後接收 accpet 它們。q 呼叫accept會產生乙個描述符,我該怎麼處理它?a 先儲存這個描述符,然後對它進行非阻塞 non blocking 的讀寫 read write 操作。q 為什麼...

Apache HttpCore官方教程筆記

httpcore是對http協議的基礎封裝的一套元件。乙個http訊息包含header和可選的body.請求頭 request header 由乙個請求行和一系列的頭字段組成。響應頭 response header 由乙個狀態行和一系列的頭字段組成。http訊息必須包含http版本。get http...