1、多級緩存架構
采用三級緩存:nginx本地緩存+redis分布式緩存+tomcat堆緩存的多級緩存架構
2.緩存中的數據分為兩種
(1).時效性要求非常高的數據:庫存、價格等 一般來說,顯示的庫存,都是時效性要求會相對高一些,因為隨着商品的不斷的交易,庫存會不斷的變化。當然,我們就希望當庫存變化的時候,盡可能更快將庫存顯示到頁面上去,而不是說等了很長時間,庫存才反應到頁面上去 (2).時效性要求不高的數據:商品的基本信息(名稱、顏色、版本、規格參數,等等) 時效性要求不高的數據,就還好,比如說你現在改變了商品的名稱,稍微晚個幾分鍾反應到商品頁面上,也還能接受 商品價格/庫存等時效性要求高的數據,采取相關的服務系統每次發生了變更的時候,直接采取數據庫和redis緩存雙寫的方案,這樣緩存的時效性最高 商品基本信息等時效性不高的數據,來自多種不同的系統,采取MQ異步通知的方式,寫一個數據生產服務,監聽MQ消息,然后異步拉取服務的數據,更新tomcat jvm緩存+redis緩存
3.多級緩存架構的工作流程
每次請求過來,優先從nginx本地緩存中提取各種數據(這里nginx+lua腳本做頁面動態生成的工作),結合頁面模板,生成需要的頁面
如果nginx本地緩存過期了,那么就從nginx到redis中去拉取數據,更新到nginx本地
如果redis中也被LRU算法清理掉了,那么就從nginx走http接口到后端的數據生產服務中拉取數據,在數據生產服務中先在本地tomcat里的jvm堆緩存中找,比如ehcache中,如果ehcache中的數據也被LRU清理掉了,那么就重新發送請求數據庫拉取數據,然后再次更新tomcat堆內存緩存+redis緩存,並返回數據給nginx,並且nginx將數據緩存到本地
4.多級緩存架構中每一層的意義
nginx本地緩存,主要是針對熱數據的高並發訪問,一般來說,商品的購買總是有熱點的,比如每天購買iphone、小米等知名品牌的東西的人總是比較多的,這些熱數據由於經常被訪問,所以可以被鎖定在nginx的本地緩存內,那么對這些熱數據的大量訪問,就直接走nginx就可以了,不需要走后續的各種網絡開銷了 redis分布式大規模緩存,主要是針對大規模的離散訪問,它提供海量的數據支撐、高並發的訪問、高可用的服務,由於redis緩存最大量的數據,最完整的數據,因此為數據庫提供了一層強有力的保護傘 nginx本地內存有限,也就能緩存部分的熱數據,除了各種iphone、小米等熱數據,其他相對不那么熱的數據,流量會經常走到redis那里 jvm堆內存緩存,主要是針對redis大規模災難的,如果redis出現了大規模的宕機,導致nginx大量流量直接涌入數據生產服務,那么最后的tomcat堆內存緩存至少可以再扛一下,不至於讓數據庫直接裸奔造成雪崩效應