關於快取命中率的幾個關鍵問題!
一、快取命中率的介紹
命中:可以直接通過快取獲取到需要的資料。
不命中:無法直接通過快取獲取到想要的資料,需要再次查詢資料庫或者執行其它的操作。原因可能是由於快取中根本不存在,或者快取已經過期。
通常來講,快取的命中率越高則表示使用快取的收益越高,應用的效能越好(響應時間越短、吞吐量越高),抗併發的能力越強。
由此可見,在高併發的網際網路系統中,快取的命中率是至關重要的指標。
二、如何監控快取的命中率
在memcached中,執行state命令可以檢視memcached服務的狀態資訊,其中cmd_get表示總的get次數,get_hits表示get的總命中次數,命中率 = get_hits/cmd_get。
當然,我們也可以通過一些開源的第三方工具對整個memcached叢集進行監控,顯示會更直觀。比較典型的包括:zabbix、MemAdmin等。
如圖:MemAdmin對memcached服務的命中率情況的監控統計
同理,在redis中可以執行info命令檢視redis服務的狀態資訊,其中keyspace_hits為總的命中中次數,keyspace_misses為總的miss次數,命中率=keyspace_hits/(keyspace_hits+keyspace_misses)。
開源工具Redis-star能以圖表方式直觀redis服務相關資訊,同時,zabbix也提供了相關的外掛對redis服務進行監控。
三、影響快取命中率的幾個因素
1、業務場景和業務需求
快取適合“讀多寫少”的業務場景,反之,使用快取的意義其實並不大,命中率會很低。
業務需求決定了對時效性的要求,直接影響到快取的過期時間和更新策略。時效性要求越低,就越適合快取。在相同key和相同請求數的情況下,快取時間越長,命中率會越高。
網際網路應用的大多數業務場景下都是很適合使用快取的。
2、快取的設計(粒度和策略)
通常情況下,快取的粒度越小,命中率會越高。舉個實際的例子說明:
當快取單個物件的時候(例如:單個使用者資訊),只有當該物件對應的資料發生變化時,我們才需要更新快取或者讓移除快取。而當快取一個集合的時候(例如:所有使用者資料),其中任何一個物件對應的資料發生變化時,都需要更新或移除快取。
還有另一種情況,假設其他地方也需要獲取該物件對應的資料時(比如其他地方也需要獲取單個使用者資訊),如果快取的是單個物件,則可以直接命中快取,反之,則無法直接命中。這樣更加靈活,快取命中率會更高。
此外,快取的更新/過期策略也直接影響到快取的命中率。當資料發生變化時,直接更新快取的值會比移除快取(或者讓快取過期)的命中率更高,當然,系統複雜度也會更高。
3、快取容量和基礎設施
快取的容量有限,則容易引起快取失效和被淘汰(目前多數的快取框架或中介軟體都採用了LRU演算法)。同時,快取的技術選型也是至關重要的,比如採用應用內建的本地快取就比較容易出現單機瓶頸,而採用分散式快取則畢竟容易擴充套件。所以需要做好系統容量規劃,並考慮是否可擴充套件。此外,不同的快取框架或中介軟體,其效率和穩定性也是存在差異的。
4、其他因素
當快取節點發生故障時,需要避免快取失效並最大程度降低影響,這種特殊情況也是架構師需要考慮的。業內比較典型的做法就是通過一致性Hash演算法,或者通過節點冗餘的方式。
有些朋友可能會有這樣的理解誤區:既然業務需求對資料時效性要求很高,而快取時間又會影響到快取命中率,那麼系統就別使用快取了。其實這忽略了一個重要因素–併發。通常來講,在相同快取時間和key的情況下,併發越高,快取的收益會越高,即便快取時間很短。
四、提高快取命中率的方法
從架構師的角度,需要應用盡可能的通過快取直接獲取資料,並避免快取失效。這也是比較考驗架構師能力的,需要在業務需求,快取粒度,快取策略,技術選型等各個方面去通盤考慮並做權衡。儘可能的聚焦在高頻訪問且時效性要求不高的熱點業務上,通過快取預載入(預熱)、增加儲存容量、調整快取粒度、更新快取等手段來提高命中率。
對於時效性很高(或快取空間有限),內容跨度很大(或訪問很隨機),並且訪問量不高的應用來說快取命中率可能長期很低,可能預熱後的快取還沒來得被訪問就已經過期了。
歡迎工作一到五年的Java工程師朋友們加入Java填坑之路:860113481
群內提供免費的Java架構學習資料(裡面有高可用、高併發、高效能及分散式、Jvm效能調優、Spring原始碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用自己每一分每一秒的時間來學習提升自己,不要再用”沒有時間“來掩飾自己思想上的懶惰!趁年輕,使勁拼,給未來的自己一個交代!
相關文章
- 關於ImageView的幾個常見問題View
- 關於解決問題的幾個段位
- @Cacheable關於快取的個人筆記快取筆記
- [併發程式設計]-關於 CAS 的幾個問題程式設計
- 有關 socialiteproviders 存在的幾個問題IDE
- 關於 AppCrawler 執行過程中的幾個小問題APP
- 關於六西格瑪,這裡有你最關心的幾個問題!
- 關於理財你最應該知道幾個問題
- [20210520]關於主鍵索引問題.txt索引
- 這幾個關於Spring 依賴注入的問題你清楚嗎?Spring依賴注入
- 阿里一面:關於【快取穿透、快取擊穿、快取雪崩、熱點資料失效】問題的解決方案阿里快取穿透
- 最近積累的幾個關於 PHP 類與 MySQL 的小問題PHPMySql
- 關於瀏覽器快取問題(圖片更換後,頁面仍優先讀取快取)瀏覽器快取
- redis13_redis快取相關問題5Redis快取
- redis快取相關問題及解決方案Redis快取
- Binder關鍵問題
- 7個關於"this"面試題,你知道幾個?面試題
- 【譯】關於四種快取的故事快取
- 關於一個歸檔問題?
- C語言的幾個關鍵字C語言
- 怎樣成為解決問題的高手?——關於問題解決的關鍵4步驟
- 關於Integer面試的一個問題面試
- 關於dcat-admin的兩個問題...
- 關於盒模型相關的問題模型
- 關於this指向的問題
- 中小企業幾個關於seo的小常識問題,你是否知道?
- 關於GD和OB快取的輸出快取
- set容器幾個關鍵函式函式
- 關於快取穿透、快取擊穿、快取雪崩的模擬與解決(Redis)快取穿透Redis
- 如何提高Redis快取命中率Redis快取
- 關於取每個使用者最新一條留言去重的問題
- 伺服器租用中有關頻寬的幾個問題伺服器
- 關於聯合索引,範圍查詢,時間列索引的幾個問題索引
- SpringBoot中關於Mybatis使用的三個問題Spring BootMyBatis
- Elasticsearch中關於transform的一個問題分析ElasticsearchORM
- 快取的問題快取
- 關於DrawerLayout的小問題
- 關於javascript的this指向問題JavaScript