複製鏈接
請複製以下鏈接發送給好友

緩存命中率

鎖定
始端用户訪問加速節點時,如果該節點有緩存住了要被訪問的數據時就叫做命中,如果沒有的話需要回原服務器取,就是沒有命中。取數據的過程與用户訪問是同步進行的,所以即使是重新取的新數據,用户也不會感覺到有延時。 命中率=命中數/(命中數+沒有命中數), 緩存命中率是判斷加速效果好壞的重要因素之一。
中文名
緩存命中率
外文名
Cache Hit Rate
取決於
很多的因素
類    型
非常適合緩存應用的場景

緩存命中率影響因素

緩存的命中率取決於很多的因素:

緩存命中率應用場景

OLTP還是OLAP應用,即使是OLTP,也要看訪問的頻度,一個極少被訪問到的緩存等於沒有什麼效果。一般來説,互聯網網站是非常適合緩存應用的場景。

緩存命中率緩存的粒度

毫無疑問,緩存的粒度越小,命中率就越高,對象緩存是緩存粒度最小的,因此被命中的幾率更高。舉個例子來説吧:你訪問當前這個頁面,瀏覽帖子,那麼對於ORM來説,需要發送n條SQL,取各自帖子user的對象。很顯然,如果這個user在其他帖子裏面也跟貼了,那麼在訪問那個帖子的時候,就可以直接從緩存裏面取這個user對象了。

緩存命中率架構的設計

架構的設計對於緩存命中率也有至關重要的影響。例如你應該如何去儘量避免緩存失效的問題,如何儘量提供頻繁訪問數據的緩存問題,這些都是考驗架構師水平的地方。再舉個例子來説,對於論壇,需要記錄每個topic的瀏覽次數,所以每次有人訪問這個topic,那麼topic表就要update一次,這意味着什麼呢?對於topic的對象緩存是無效的,每次訪問都要更新緩存。那麼可以想一些辦法,例如增加一箇中間變量記錄點擊次數,每累計一定的點擊,才更新一次數據庫,從而減低緩存失效的頻率。

緩存命中率緩存的容量

緩存太小,造成頻繁的LRU,也會降低命中率,緩存的有效期太短也會造成緩存命中率下降。
所以緩存命中率問題不能一概而論,一定説命中率很低或者命中率很高。但是如果你對於緩存的掌握很精通,有意識的去調整應用的架構,去分解緩存的粒度,總是會帶來很高的命中率的。

緩存命中率實際案例

這裏我可以舉一個實際的案例,JavaEye2.0網站在使用對象緩存之前,通過MySQL的監控工具進行觀察,在連續24小時的平均每秒發送SQL條數超過了200條,在使用對象緩存之後,連續24小時的平均每秒發送SQL條數下降到了120條左右,幾乎下降了一半。
考慮到很多SQL都是分頁語句,關聯查詢,條件查詢,集合操作,都是不能被緩存的SQL,而真正能夠被緩存的SQL只有根據主鍵查詢對象和對象關聯對象的查詢。所以真正能夠被緩存的SQL估計最多佔所有SQL的60%。所以換算下來,應用緩存的命中率之高,已經相當驚人了。
不過這裏要提醒的一點,有將近一半的SQL都被緩存,不意味着性能可以提升一倍。這是因為能夠被緩存的都是按照主鍵查詢單條記錄的SQL,這些SQL本身即使發送到數據庫,對數據庫造成的壓力也沒有想像的那麼大。真正對數據庫造成龐大壓力的正是那些沒有索引的大表查詢,和造成了全表掃描的關聯查詢,這些一旦涉及到全表掃描的查詢,才是性能的真正殺手。當然了,不管怎麼説,通過使用對象緩存,是毫無疑問可以大幅度降低數據庫的負載壓力的,有效提升web應用的性能的。
關於這一點,我再給出一組數據來加深大家的印象,通過使用操作系統網絡工具進行統計:
JavaEye網站web server的端口每秒數據流量是2MB;
JavaEye網站的MySQL數據庫端口的每秒數據流量是1.2MB;
而網站的memcached的端口每秒的數據流量高達5MB