緩存是架構設計中一個重要的手段,它的技術比較簡單,同時對性能提高又有特別顯著的效果,在不少地方都會用到。使用緩存須要注意3個關鍵因素,它們決定了緩存的有效性、緩存的使用效率、緩存實現的效果:算法
一、緩存鍵集合大小數據庫
二、緩存空間的大小緩存
三、緩存的使用壽命微信
閱讀本篇文章將使用5分鐘的時間,幫你提高緩存命中率。架構
緩存的主要特色是一次寫入屢次讀出,經過這種手段減小對數據庫的使用,儘快從緩存中讀取數據,提升性能。因此緩存是否有效,主要就是看它一次寫進去的緩存能不可以屢次去讀出來響應業務的請求,這個指標就叫作緩存的命中率。緩存命中率怎麼算呢?查詢獲得正確緩存結果去比上總的查詢次數,獲得的指標就是緩存命中率,好比說十次查詢九次都可以獲得緩存的正確結果,他的命中率就是90%。分佈式
影響緩存命中率的主要因素有三個,分別是緩存鍵集合的大小、內存空間大小和緩存的壽命。性能
緩存中的每一個對象都是經過緩存鍵進行識別的。好比咱們拿到key、value結構,key是字符串abc,value是字符串hello,abc就是其中的一個緩存鍵。鍵是緩存中惟一的識別符,定位一個對象的惟一方式就是對緩存鍵進行精確的匹配。網站
好比咱們想緩存每一個商品的在線商品信息,就須要使用商品ID做爲緩存鍵。換句話說,緩存鍵空間是你的應用可以生成的全部鍵的數量。從統計數字上看,應用生成的惟一鍵越多,重用的機會越小。好比說根據IP地址緩存天氣數據,可能須要40多億個鍵。可是若是基於國家緩存天氣數據,那麼只須要幾百個緩存鍵就夠了,全世界也不過就幾百個國家。架構設計
因此要儘量減小緩存鍵的數量,鍵的數量越少,緩存的效率越高。設計緩存的時候要關注緩存鍵是如何進行設計的,它的整個的集合範圍,限定在一個既可以高效使用,又能夠減小它的數量,這個時候緩存的性能是最好的。設計
緩存可使用的內存空間決定了緩存對象平均大小和緩存對象的數量。由於緩存一般是存儲在內存中的,緩存對象可用的內存空間相對來講比較昂貴,並且受到嚴格限制。
若是想緩存更多的對象,就須要先刪除老的對象,再添加新的對象。而這些老的對象被刪除掉,就會影響到緩存的命中率。因此物理上緩存的空間越大,緩存的對象越多,緩存的命中率也就越高。
緩存對象的生存時間稱爲TTL。
對象緩存的時間越長,被重用的可能性就越高。使緩存失效的方法有兩種:
1)超時失效
超時失效是在構建緩存,也就是在寫緩存的時候,每一個緩存對象都設置一個超時時間,在超時以前訪問緩存就會返回緩存的數據,而一旦超時緩存就失效了,這時候再訪問緩存,就會返回空。
2)實時清除
而實時清除是說,當有緩存對象更新的時候,直接通知緩存將已經被更新了的數據進行清除。清除了之後,應用程序下一次訪問這個緩存對象鍵的時候,由於緩存已經清除了,不得不到數據庫中去查找讀取,這個時候就會獲得最新的數據。由於更新老是更新在數據庫裏的。
還有一種雖然時間上尚未失效,可是新的對象要寫入緩存,而內存空間不夠了,這個時候就須要將一些老的緩存對象清理掉,爲新的緩存對象騰出空間。
內存空間清除主要使用的算法是LRU算法,LRU算法就是最近最久未用算法。清除的時候,去清除那些最近最久沒有被訪問過的對象,這個算法使用鏈表結構實現的。全部的緩存對象都放在同一個鏈表上。當一個對象被訪問的時候,就把這個對象移到整個鏈表的頭部。當須要經過LRU算法清除那些最近最久未用對象的時候,只須要從隊列的尾部進行查找,越是在隊列尾部的越是最近最久沒有被訪問過的,優先清除的,騰出的內存空間讓新對象加入進來。
以上3個條件即爲決定緩存命中率的關鍵要素,熟練掌握後,會對緩存有更深的理解。
以上內容摘取自拉勾《阿里前輩的架構經》 第02講(上):分佈式緩存 點擊查看更多
主講人:李智慧,前阿里巴巴技術專家,《大型網站技術架構》做者
加拉勾職場導師微信:lagouandy,可不定時參與簡歷1v1診斷抽獎活動,更有拉勾官方技術交流社羣等你加入