如何提高Redis緩存命中率

轉摘於 :https://www.cnblogs.com/dinglang/p/6117309.html

              https://blog.csdn.net/weixin_34238633/article/details/85968131


緩存命中率的介紹

命中:可以直接通過緩存獲取到需要的數據。

不命中:無法直接通過緩存獲取到想要的數據,需要再次查詢數據庫或者執行其它的操作。原因可能是由於緩存中根本不存在,或者緩存已經過期。

通常來講,緩存的命中率越高則表示使用緩存的收益越高,應用的性能越好(響應時間越短、吞吐量越高),抗併發的能力越強

由此可見,在高併發的互聯網系統中,緩存的命中率是至關重要的指標

如何監控緩存的命中率

redis提供了INFO這個命令,能夠隨時監控服務器的狀態,只用telnet到對應服務器的端口,執行命令即可:

telnet localhost 6379  info

在輸出的信息裏面有這幾項和緩存的狀態比較有關係:

keyspace_hits:14414110  
keyspace_misses:3228654  
used_memory:433264648  
expired_keys:1333536  
evicted_keys:1547380

通過計算hits和miss,我們可以得到緩存的命中率:14414110 / (14414110 + 3228654) = 81% ,一個緩存失效機制,和過期時間設計良好的系統,命中率可以做到95%以上

有個ruby gem叫redis-stat,它利用INFO命令展現出更直觀的信息報表,推薦:
https://github.com/junegunn/redis-stat

同時,zabbix也提供了相關的插件對redis服務進行監控。

影響緩存命中率的幾個因素

之前的章節中我們提到了緩存命中率的重要性,下面分析下影響緩存命中率的幾個因素。

1.業務場景和業務需求

緩存適合“讀多寫少”的業務場景,反之,使用緩存的意義其實並不大,命中率會很低。

業務需求決定了對時效性的要求,直接影響到緩存的過期時間和更新策略。時效性要求越低,就越適合緩存。在相同key和相同請求數的情況下,緩存時間越長,命中率會越高。

互聯網應用的大多數業務場景下都是很適合使用緩存的。

2.緩存的設計(粒度和策略)

通常情況下,緩存的粒度越小,命中率會越高。舉個實際的例子說明:

當緩存單個對象的時候(例如:單個用戶信息),只有當該對象對應的數據發生變化時,我們才需要更新緩存或者讓移除緩存。而當緩存一個集合的時候(例如:所有用戶數據),其中任何一個對象對應的數據發生變化時,都需要更新或移除緩存。

還有另一種情況,假設其他地方也需要獲取該對象對應的數據時(比如其他地方也需要獲取單個用戶信息),如果緩存的是單個對象,則可以直接命中緩存,反之,則無法直接命中。這樣更加靈活,緩存命中率會更高。

此外,緩存的更新/過期策略也直接影響到緩存的命中率。當數據發生變化時,直接更新緩存的值會比移除緩存(或者讓緩存過期)的命中率更高,當然,系統複雜度也會更高。

3.緩存容量和基礎設施

緩存的容量有限,則容易引起緩存失效和被淘汰(目前多數的緩存框架或中間件都採用了LRU算法)。同時,緩存的技術選型也是至關重要的,比如採用應用內置的本地緩存就比較容易出現單機瓶頸,而採用分佈式緩存則畢竟容易擴展。所以需要做好系統容量規劃,並考慮是否可擴展。此外,不同的緩存框架或中間件,其效率和穩定性也是存在差異的。

4.其他因素

當緩存節點發生故障時,需要避免緩存失效並最大程度降低影響,這種特殊情況也是架構師需要考慮的。業內比較典型的做法就是通過一致性Hash算法,或者通過節點冗餘的方式。

 

有些朋友可能會有這樣的理解誤區:既然業務需求對數據時效性要求很高,而緩存時間又會影響到緩存命中率,那麼系統就別使用緩存了。其實這忽略了一個重要因素--併發。通常來講,在相同緩存時間和key的情況下,併發越高,緩存的收益會越高,即便緩存時間很短

提高緩存命中率的方法

從架構師的角度,需要應用儘可能的通過緩存直接獲取數據,並避免緩存失效。這也是比較考驗架構師能力的,需要在業務需求,緩存粒度,緩存策略,技術選型等各個方面去通盤考慮並做權衡。儘可能的聚焦在高頻訪問且時效性要求不高的熱點業務上(如字典數據、session、token),通過緩存預加載(預熱)增加存儲容量調整緩存粒度更新緩存等手段來提高命中率。

對於時效性很高(或緩存空間有限),內容跨度很大(或訪問很隨機),並且訪問量不高的應用來說緩存命中率可能長期很低,可能預熱後的緩存還沒來得被訪問就已經過期了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章