1、簡介:
和大多NoSQL數據庫同樣,Redis一樣遵循了Key/Value數據存儲模型。在有些狀況下,Redis會將Keys/Values保存在內存中以提升數據查詢和數據修改的效率,然而這樣的作法並不是老是很好的選擇。鑑於此,咱們能夠將之進一步優化,即儘可能在內存中只保留Keys的數據,這樣能夠保證數據檢索的效率,而Values數據在不多使用的時候則能夠被換出到磁盤。
在實際的應用中,大約只有10%的Keys屬於相對比較經常使用的鍵,這樣Redis就能夠經過虛存將其他不經常使用的Keys和Values換出到磁盤上,而一旦這些被換出的Keys或Values須要被讀取時,Redis則將其再次讀回到主內存中。
2、應用場景:
對於大多數數據庫而言,最爲理想的運行方式就是將全部的數據都加載到內存中,而以後的查詢操做則能夠徹底基於內存數據完成。然而在現實中這樣的場景卻並不廣泛,更多的狀況則是隻有部分數據能夠被加載到內存中。
在Redis中,有一個很是重要的概念,即keys通常不會被交換,因此若是你的數據庫中有大量的keys,其中每一個key僅僅關聯很小的value,那麼這種場景就不是很是適合使用虛擬內存。若是偏偏相反,數據庫中只是包含少許的keys,而每個key所關聯的value卻很是大,那麼這種場景對於使用虛存就再合適不過了。
在實際的應用中,爲了能讓虛存更爲充分的發揮做用以幫助咱們提升系統的運行效率,咱們能夠將帶有不少較小值的Keys合併爲帶有少許較大值的Keys。其中最主要的方法就是將原有的Key/Value模式改成基於Hash的模式,這樣可讓不少原來的Keys成爲Hash中的屬性。
3、配置:
1). 在配置文件中添加如下配置項,以使當前Redis服務器在啓動時打開虛存功能。
vm-enabled yes
2). 在配置文件中設定Redis最大可用的虛存字節數。若是內存中的數據大於該值,則有部分對象被換出到磁盤中,其中被換出對象所佔用內存將被釋放,直到已用內存小於該值時才中止換出。
vm-max-memory (bytes)
Redis的交換規則是儘可能考慮"最老"的數據,即最長時間沒有使用的數據將被換出。若是兩個對象的age相同,那麼Value較大的數據將先被換出。須要注意的是,Redis不會將Keys交換到磁盤,所以若是僅僅keys的數據就已經填滿了整個虛存,那麼這種數據模型將不適合使用虛存機制,或者是將該值設置的更大,以容納整個Keys的數據。在實際的應用,若是考慮使用Redis虛擬內存,咱們應儘量的分配更多的內存交給Redis使用,以免頻繁的換入換出。
3). 在配置文件中設定頁的數量及每一頁所佔用的字節數。爲了將內存中的數據傳送到磁盤上,咱們須要使用交換文件。這些文件與數據持久性無關,Redis會在退出前會將它們所有刪除。因爲對交換文件的訪問方式大多爲隨機訪問,所以建議將交換文件存儲在固態磁盤上,這樣能夠大大提升系統的運行效率。
vm-pages 134217728
vm-page-size 32
在上面的配置中,Redis將交換文件劃分爲vm-pages個頁,其中每一個頁所佔用的字節爲vm-page-size,那麼Redis最終可用的交換文件大小爲:vm-pages * vm-page-size。因爲一個value能夠存放在一個或多個頁上,可是一個頁不能持有多個value,鑑於此,咱們在設置vm-page-size時須要充分考慮Redis的該特徵。
4). 在Redis的配置文件中有一個很是重要的配置參數,即:
vm-max-threads 4
該參數表示Redis在對交換文件執行IO操做時所應用的最大線程數量。一般而言,咱們推薦該值等於主機的CPU cores。若是將該值設置爲0,那麼Redis在與交換文件進行IO交互時,將以同步的方式執行此操做。
對於Redis而言,若是操做交換文件是以同步的方式進行,那麼當某一客戶端正在訪問交換文件中的數據時,其它客戶端若是再試圖訪問交換文件中的數據,該客戶端的請求就將被掛起,直到以前的操做結束爲止。特別是在相對較慢或較忙的磁盤上讀取較大的數據值時,這種阻塞所帶來的影響就更爲突兀了。然而同步操做也並不是一無可取,事實上,從全局執行效率視角來看,同步方式要好於異步方式,畢竟同步方式節省了線程切換、線程間同步,以及線程拉起等操做產生的額外開銷。特別是當大部分頻繁使用的數據均可以直接從主內存中讀取時,同步方式的表現將更爲優異。
若是你的現實應用偏偏相反,即有大量的換入換出操做,同時你的系統又有不少的cores,有鑑於此,你又不但願客戶端在訪問交換文件以前不得不阻塞一小段時間,若是確實是這樣,我想異步方式可能更適合於你的系統。
至於最終選用哪一種配置方式,最好的答案未來自於不斷的實驗和調優。數據庫