**:
首先說明下redis的虛擬記憶體與os的虛擬記憶體不是一碼事,但是思路和目的都是相同的。就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的 記憶體空間用於其他需要訪問的資料。尤其是對於redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割到多個redis server外。另外的能夠提高資料庫容量的辦法就是使用vm把那些不經常訪問的資料交換的磁碟上。如果我們的儲存的資料總是有少部分資料被經常訪問,大 部分資料很少被訪問,對於**來說確實總是只有少量使用者經常活躍。當少量資料被經常訪問時,使用vm不但能提高單台redis server資料庫的容量,而且也不會對效能造成太多影響。
redis沒有使用os提供的虛擬記憶體機制而是自己在使用者態實現了自己的虛擬記憶體機制,作者在自己的blog專門解釋了其中原因。
主要的理由有兩點
1.os 的虛擬記憶體是已4k頁面為最小單位進行交換的。而redis的大多數物件都遠小於4k,所以乙個os頁面上可能有多個redis物件。另外redis的集 合物件型別如list,set可能存在與多個os頁面上。最終可能造成只有10%key被經常訪問,但是所有os頁面都會被os認為是活躍的,這樣只有內 存真正耗盡時os才會交換頁面。
2.相比於os的交換方式。redis可以將被交換到磁碟的物件進行壓縮,儲存到磁碟的物件可以去除指標和物件元資料資訊。一般壓縮後的物件會比記憶體中的物件小10倍。這樣redis的vm會比os vm能少做很多io操作。
下面是vm相關配置
vm-enabled yes #開啟vm功能
vm-swap-file /tmp/redis.swap #交換出來的value儲存的檔案路徑/tmp/redis.swap
vm-max-memory 1000000 #redis使用的最大記憶體上限,超過上限後redis開始交換value到磁碟檔案中。
vm-page-size 32 #每個頁面的大小32個位元組
vm-pages 134217728 #最多使用在檔案中使用多少頁面,交換檔案的大小 = vm-page-size * vm-pages
vm-max-threads 4 #用於執行value物件換入換出的工作執行緒數量。0表示不使用工作執行緒(後面介紹)
引數配置討論完後,在來簡單介紹下vm是如何工作的,
當vm-max-threads設為0時(blocking vm)
換出主線程定期檢查發現記憶體超出最大上限後,會直接已阻塞的方式,將選中的物件儲存到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這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割到多...