一、簡介:
和大多數NoSQL資料庫一樣,Redis也遵循了Key/Value資料儲存模型。在某些情況下,Redis會將Keys/Values保存在記憶體中以提高資料查詢和資料修改的效率,然而這樣的做法並非總是很好的選擇。有鑑於此,我們可以將之進一步優化,即盡量在內存中只保留Keys的數據,這樣可以保證數據檢索的效率,而Values數據在很少使用的時候則可以被換出到磁碟。
在實際的應用中,大約只有10%的Keys屬於相對比較常用的鍵,這樣Redis就可以透過虛存將其餘不常用的Keys和Values換出到磁碟上,而一旦這些被換出的Keys或Values需要讀取時,Redis則將其再次讀回主記憶體中。
二、應用場景:
對大多數資料庫而言,最為理想的運作方式就是將所有的資料載入記憶體中,而之後的查詢作業則可以完全基於記憶體資料完成。然而在現實中這樣的場景卻並不普遍,更多的情況則是只有部分資料可以被載入到記憶體中。
在Redis中,有一個非常重要的概念,即keys通常不會被交換,所以如果你的資料庫中有大量的keys,其中每個key僅僅關聯很小的value,那麼這種場景就不是非常適合使用虛擬記憶體。如果相反,資料庫中只是包含少量的keys,而每一個key所關聯的value卻非常大,那麼這種場景對於使用虛存就再合適不過了。
在實際的應用中,為了能讓虛存更為充分的發揮作用以幫助我們提高系統的運作效率,我們可以將帶有很多較小值的Keys合併為帶有少量較大值的Keys。其中最主要的方法就是將原有的Key/Value模式改為基於Hash的模式,這樣可以讓許多原來的Keys成為Hash中的屬性。
三、設定:
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
CPU cores。如果将该值设置为0,那么Redis在与交换文件进行IO交互时,将以同步的方式执行此操作。
对于Redis而言,如果操作交换文件是以同步的方式进行,那么当某一客户端正在访问交换文件中的数据时,其它客户端如果再试图访问交换文件中的数据,该客户端的请求就将被挂起,直到之前的操作结束为止。特别是在相对较慢或较忙的磁盘上读取较大的数据值时,这种阻塞所带来的影响就更为突兀了。然而同步操作也并非一无是处,事实上,从全局执行效率视角来看,同步方式要好于异步方式,毕竟同步方式节省了线程切换、线程间同步,以及线程拉起等操作产生的额外开销。特别是当大部分频繁使用的数据都可以直接从主内存中读取时,同步方式的表现将更为优异。
如果你的现实应用恰恰相反,即有大量的换入换出操作,同时你的系统又有很多的cores,有鉴于此,你又不希望客户端在访问交换文件之前不得不阻塞一小段时间,如果确实是这样,我想异步方式可能更适合于你的系统。
至于最终选用哪种配置方式,最好的答案将来自于不断的实验和调优。
以上就是Redis教程(十一):虚拟内存介绍的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!