Redis 內存陷阱

redis是個對內存依賴性很強的NoSql數據庫,在內存足夠的狀況下性能出色linux

若是隻有一臺機子去部署redis,必定要特別當心。redis

好比我有臺24G的服務器,理所固然我會將大量內存分配給redis。數據庫

好比20G的內存, 問題來了, 當你對redis插入數據後,redis會異步將數據dump到硬盤中服務器

想起來很完美,問題是它會fork一個進程,並佔去一樣大小的內存,你須要的內存瞬間便爲 20G+20G =40G異步

這時內存超過了物理內存的限制,立刻會啓動虛擬內存,個人機子上是8G虛擬內存,重點是這個是linux的虛擬內存,並非redis本身的虛擬內存。性能

linux的虛擬內存 page很大,IO劇增,dump速度會很是慢,整個服務器的性能降到冰點,服務請求都會堵塞。最嚴重到機子壞掉。spa

對於單臺機子最好是下降redis虛擬內存設置,page能夠根據配置修改,這個虛擬內存比linux的虛擬內存好不少,由於page小不少。orm

若是你的redis既有讀又有寫,那麼最好不要讓redis佔去大半的內存。進程

能夠設置它的虛擬內存到8G,這還要根據你的key值大小的衡量,由於key是必須在內存中的,這樣一來就算啓用了虛擬內存,redis佔去的實際內存也會超出設想。內存

天哪, 就是說必須給redis留出他自己須要一倍以上的內存,平時在不插入數據的時候,內存空着不用,浪費。

此外官方文檔中建議對key小,value很大的數據設置虛擬內存。

另外master/slave不是很成熟,目前只支持主從,Redis在master是非阻塞模式,也就是說在slave執行數據同步的時候,master是能夠接受客戶端的請求的,並不影響同步數據的一致性,然而在slave端是阻塞模式的,slave在同步master數據時,並不可以響應客戶端的查詢

能夠根據master/slave的特色,master不dump,它只負責寫數據,讓slave去dump

相關文章
相關標籤/搜索