通常來講,快取的命中率越高則表示使用快取的收益越高,應用的效能越好(響應時間越短、吞吐量越高),抗併發的能力越強。
由此可見,在高併發的網際網路系統中,快取的命中率是至關重要的指標。
如何檢視redis快取命中率
redis-cli -h xx -p xx info stats
可以看到
keyspace_hits:90176387
keyspace_misses:5182698
快取命中率:keyspace_hits / (keyspace_hits + keyspace_misses)
2.1 業務場景
快取適合「讀多寫少」的業務場景,反之,使用快取的意義其實並不大,命中率會很低。
2.2 時效性
業務需求決定了對時效性的要求,直接影響到快取的過期時間和更新策略。時效性要求越低,就越適合快取。在相同key和相同請求數的情況下,快取時間越長,命中率會越高。
網際網路應用的大多數業務場景下都是很適合使用快取的。
2.3 快取粒度
通常情況下,快取的粒度越小,命中率會越高。
舉個實際的例子說明:
當快取單個物件的時候(例如:單個使用者資訊),只有當該物件對應的資料發生變化時,我們才需要更新快取或者讓移除快取。而當快取乙個集合的時候(例如:所有使用者資料),其中任何乙個物件對應的資料發生變化時,都需要更新或移除快取。
還有另一種情況,假設其他地方也需要獲取該物件對應的資料時(比如其他地方也需要獲取單個使用者資訊),如果快取的是單個物件,則可以直接命中快取,反之,則無法直接命中。這樣更加靈活,快取命中率會更高。
2.4 過期時間和更新策略
快取的更新/過期時間和策略也直接影響到快取的命中率。此處的快取過期策略並非redis自帶的定期刪除和惰性刪除策略,而是根據業務場景優化key的過期時間和更新策略。
如使用者的key資訊,如果同時過期,那麼多個使用者同時查詢時,就會落到資料庫去,也就是要避免快取同時失效。當資料發生變化時,直接更新快取的值會比移除快取(或者讓快取過期)的命中率更高,當然,系統複雜度也會更高。
2.5 快取預載入-預熱
redis的快取大部分是從資料庫載入的,那麼第一次使用資料的時候,redis需要從資料庫去載入資料,所以在對使用者前,可以提前載入需要的資料到快取,這樣使用者在第一次訪問的時候就可以直接走快取而不是去查詢資料庫。
2.6 快取擊穿和快取穿透
(1)應用訪問快取,假如資料存在,則直接返回資料
(2)資料在redis不存在,則去訪問資料庫,資料庫查詢到了直接返回應用,同時把結果寫回redis
(3)資料在redis不存在,資料庫也不存在,返回空,一般來說空值是不會寫入redis的,如果反覆請求同一條資料,那麼則會發生快取穿透
解決:可以使用布隆過濾器先判斷key是否存在,存在才去redis快取讀取(redis快取裡可能key也不存在,這時候就去資料庫讀取,沒有則返回空)
2.7 快取容量
要注意快取容量,太小會觸發redis的記憶體淘汰機制,線上redis一般配置maxmemory-policy allkeys-lru演算法來進行記憶體淘汰,這樣有一部分key會被刪除,導致快取穿透,從而降低快取命中率,因此合理配置快取容量很有必有。
注意:對於時效性很高(或快取空間有限),內容跨度很大(或訪問很隨機),並且訪問量不高的應用來說快取命中率可能長期很低,可能預熱後的快取還沒來得被訪問就已經過期了。
如何提高快取命中率(Redis)
命中 可以直接通過快取獲取到需要的資料。不命中 無法直接通過快取獲取到想要的資料,需要再次查詢資料庫或者執行其它的操作。原因可能是由於快取中根本不存在,或者快取已經過期。通常來講,快取的命中率越高則表示使用快取的收益越高,應用的效能越好 響應時間越短 吞吐量越高 抗併發的能力越強。由此可見,在高併發...
如何提高快取命中率
命中 可以直接通過快取獲取到需要的資料。不命中 無法直接通過快取獲取到想要的資料,需要再次查詢資料庫或者執行其它的操作。原因可能是由於快取中根本不存在,或者快取已經過期。通常來講,快取的命中率越高則表示使用快取的收益越高,應用的效能越好 響應時間越短 吞吐量越高 抗併發的能力越強。由此可見,在高併發...
提高快取命中率
原因是快取不存在或者快取已過期 通過redis提供的info命令檢視引數 命令 127.0.0.1 info輸出 expired keys 2061008 evicted keys 0 keyspace hits 19528495 keyspace misses 2915371計算公式 命中率 擊中...