首先說明下redis的虛擬記憶體與os的虛擬記憶體不是一碼事,但是思路和目的都是相同的。就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的 記憶體空間用於其他需要訪問的資料。尤其是對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割到多個redis server外。另外的能夠提高資料庫容量的辦法就是使用vm把那些不經常訪問的資料交換的磁碟上。如果我們的儲存的資料總是有少部分資料被經常訪問,大 部分資料很少被訪問,對於**來說確實總是只有少量使用者經常活躍。當少量資料被經常訪問時,使用vm不但能提高單台redis server資料庫的容量,而且也不會對效能造成太多影響。
redis沒有使用os提供的虛擬記憶體機制而是自己在使用者態實現了自己的虛擬記憶體機制,作者在自己的blog專門解釋了其中原因。http://antirez.com/post/redis-virtual-memory-story.html
換出 主線程定期檢查發現記憶體超出最大上限後,會直接已阻塞的方式,將選中的物件儲存到swap檔案中,並釋放物件占用的記憶體,此過程會一直重複直到下面條件滿足
1.記憶體使用降到最大限制以下
2.swap檔案滿了
3.幾乎全部的物件都被交換到磁碟了
換入 當有client請求value被換出的key時。主線程會以阻塞的方式從檔案中載入對應的value物件,載入時此時會阻塞所有client。然後處理client的請求
當vm-max-threads大於0(threaded vm)
換出 當主線程檢測到使用記憶體超過最大上限,會將選中的要交換的物件資訊放到乙個佇列中交由工作執行緒後台處理,主線程會繼續處理client請求。
換入 如果有client請求的key被換出了,主線程先阻塞發出命令的client,然後將載入物件的資訊放到乙個佇列中,讓工作執行緒去載入。載入完畢後工作執行緒通知主線程。主線程再執行client的命令。這種方式只阻塞請求value被換出key的client
總 的來說blocking vm的方式總的效能會好一些,因為不需要執行緒同步,建立執行緒和恢復被阻塞的client等開銷。但是也相應的犧牲了響應性。threaded vm的方式主線程不會阻塞在磁碟io上,所以響應性更好。如果我們的應用不太經常發生換入換出,而且也不太在意有點延遲的話則推薦使用blocking vm的方式。關於redis vm的更詳細介紹可以參考下面鏈結
九 redis學習筆記之虛擬記憶體
首先說明下redis的虛擬記憶體與os的虛擬記憶體不是一碼事,但是思路和目的都是相同的。就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的 記憶體空間用於其他需要訪問的資料。尤其是對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割到多個redis server外。另...
九 redis學習筆記之虛擬記憶體
九 redis學習筆記之虛擬記憶體 首先說明下redis的虛擬記憶體與os的虛擬記憶體不是一碼事,但是思路和目的都是相同的。就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的 記憶體空間用於其他需要訪問的資料。尤其是對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割...
redis學習筆記之虛擬記憶體
redis學習筆記之虛擬記憶體 首先說明下redis的虛擬記憶體與os的虛擬記憶體不是一碼事,但是思路和目的都是相同的。就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的 記憶體空間用於其他需要訪問的資料。尤其是對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割到多...