緩存策略匯總

上一篇 <<<動(dòng)靜分離架構(gòu)模式
下一篇 >>>后端服務(wù)的雪崩效應(yīng)及解決思路


1.瀏覽器緩存

瀏覽器自帶緩存304:圖片的默認(rèn)緩存時(shí)間為7天
客戶端(瀏覽器)發(fā)送請(qǐng)求到服務(wù)器端 第一次請(qǐng)求的時(shí)候會(huì)緩存所有的靜態(tài)資源到瀏覽器;
客戶端發(fā)送第二次請(qǐng)求的時(shí)候 如果本地瀏覽器有緩存,就使用本地瀏覽器的;
Key:訪問(wèn)的url
value:具體的值信息

原理:
a、第一次下載資源的時(shí)候,客戶端會(huì)保存修改時(shí)間
b、第二次下載資源的時(shí)候,客戶端上傳修改時(shí)間,服務(wù)端決定返回200還304.
----這種時(shí)間不一定準(zhǔn),所以請(qǐng)求的時(shí)候一般會(huì)加上一個(gè)時(shí)間戳或版本號(hào)信息強(qiáng)制刷新。http://www.baidu.com?v=20200202
動(dòng)態(tài)資源:
需要手動(dòng)在響應(yīng)頭里加上最后修改時(shí)間,默認(rèn)不會(huì)自動(dòng)緩存

2.Nginx靜態(tài)頁(yè)面緩存

配置nginx的緩存策略,含名稱、存放位置、存放大小限制、有效期和狀態(tài)信息,其中key為url信息。
如果url不變,就算上游服務(wù)器掛了,也能從nginx中直接獲取。缺點(diǎn)是上游服務(wù)器變了,由于url沒(méi)變,緩存數(shù)據(jù)無(wú)法刷新。所以解決nginx緩存刷新的關(guān)鍵在于url的變更,可以加上時(shí)間戳。

# 代理緩存配置
   proxy_cache_path "./meite_cachedata"  levels=1:2 keys_zone=meitecache:256m inactive=1d max_size=1000g; 
    server {
        listen       80;
        server_name  localhost;
        location /details {
           #使用緩存名稱
           proxy_cache meitecache;
           #對(duì)以下狀態(tài)碼實(shí)現(xiàn)緩存
           proxy_cache_valid 200 206 304 301 302 1d;
           #緩存的key
           proxy_cache_key $request_uri;
           add_header X-Cache-Status $upstream_cache_status;
           proxy_pass   http://127.0.0.1:8080;
           index  index.html index.htm;
        }
        location /all {
           proxy_pass   http://127.0.0.1:8080;
           index  index.html index.htm;
        }
    }

3.CDN內(nèi)容分發(fā)緩存

CDN的全稱是Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò),是一組分布在多個(gè)不同地理位置的Web服務(wù)器,目的是使用戶能就近地獲取請(qǐng)求數(shù)據(jù),解決網(wǎng)絡(luò)擁塞,提高訪問(wèn)速度,解決由于網(wǎng)絡(luò)帶寬小、用戶訪問(wèn)量大、網(wǎng)點(diǎn)分布不均等原因?qū)е碌脑L問(wèn)速度慢的問(wèn)題。CDN能夠緩存JavaScript腳本、CSS樣式表、圖片、圖標(biāo)、Flash等靜態(tài)資源文件(不包括html頁(yè)面),這些靜態(tài)資源文文件的訪問(wèn)頻率很高,將其緩存在CDN可以極大地提高網(wǎng)站的訪問(wèn)速度。

原理:能夠?qū)㈧o態(tài)資源緩存到全國(guó)各地節(jié)點(diǎn)能夠減少客戶端與cdn帶寬距離傳輸提高響應(yīng)速度; 就近原則

為什么將靜態(tài)資源存放到第三方服務(wù)器效率非常高呢?
1M公網(wǎng)帶寬的理論下載速度是128k/s,一張圖如果2M,則需要16s,如果并發(fā)量很高,則速度會(huì)非常的慢,而且非常的占用帶寬,而且還和傳輸?shù)木嚯x有關(guān)系。
如果圖片過(guò)大的情況下,建議將一張大圖拆分n多個(gè)小圖加載;
為了解決以上問(wèn)題,可以使用第三方服務(wù)器,因?yàn)?br> 1、云服務(wù)器簽訂帶寬都是將T算的,價(jià)格更便宜
2、CDN內(nèi)容分發(fā),能夠?qū)㈧o態(tài)資源緩存到全國(guó)各地節(jié)點(diǎn)能夠減少客戶端與cdn帶寬距離傳輸提高響應(yīng)速度; 就近原則。

傳統(tǒng)方式架構(gòu)弊端?
a.帶寬傳輸壓力大
b.因?yàn)樗杏脩羧烤奂酵粋€(gè)地區(qū)服務(wù)器上訪問(wèn),無(wú)法保證整體的系統(tǒng)高可用
c.因?yàn)槿绻蛻舳伺c服務(wù)器端傳輸距離越遠(yuǎn),那么寬帶傳輸非常耗資源,導(dǎo)致用戶體驗(yàn)非常差,響應(yīng)慢。

CDN安全控制或還提供了其他什么服務(wù)?
防止DDOS攻擊、DNS負(fù)載均衡、實(shí)現(xiàn)WEB安全防御功能,比如黑名單和白名單

4.服務(wù)端SpringBoot整合Redis緩存

a、啟動(dòng)的配置文件上加上注解@EnableCaching
b、使用的地方加上注解
@Cacheable(cacheNames = "case",key = "'caseDetail'")
cachenames相當(dāng)于文件夾,后面的key為具體的key,key一定要加上單引號(hào),不加會(huì)報(bào)錯(cuò)
緩存的內(nèi)容必須要實(shí)現(xiàn)序列化
----存在數(shù)據(jù)庫(kù)和redis同步性問(wèn)題。

@SpringBootApplication
@EnableCaching
@MapperScan("com.jarye.mapper")
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class);
    }
}

@Cacheable(cacheNames = "members", key = "'getListMembers'")
@RequestMapping("/getListMembers")
public List<MemberEntity> getListMembers() {
    return userMapper.findMemberAll();
}

5.其他緩存

和redis緩存一樣的Ehcache、Memcache等第三方緩存、JVM自帶內(nèi)置緩存、數(shù)據(jù)庫(kù)緩存

6.緩存需要考慮的問(wèn)題

1、Redis與數(shù)據(jù)庫(kù)一致性問(wèn)題:mq訂閱binlog,可同步數(shù)據(jù)一致性問(wèn)題
2、JVM與Redis保持一致性問(wèn)題:出現(xiàn)不一致的時(shí)候,同步數(shù)據(jù)庫(kù)的值為一致。
3、Nginx緩存與服務(wù)器端真實(shí)緩存一致問(wèn)題:
a. 使用版本號(hào)控制
b. 手動(dòng)清除Nginx緩存,需要物理刪除
c. 使用lua+openresty實(shí)現(xiàn)動(dòng)態(tài)商品詳情頁(yè)面


推薦閱讀:
<<<高并發(fā)架構(gòu)的整體思路
<<<一個(gè)網(wǎng)站訪問(wèn)慢的真正原因
<<<高并發(fā)情況下,接口的代碼會(huì)存在哪些問(wèn)題
<<<壓縮靜態(tài)資源減少帶寬傳輸?shù)姆绞?/a>
<<<
動(dòng)靜分離架構(gòu)模式
<<<后端服務(wù)的雪崩效應(yīng)及解決思路
<<<服務(wù)的隔離、降級(jí)和熔斷
<<<服務(wù)限流之計(jì)數(shù)器方式
<<<服務(wù)限流之滑動(dòng)窗口計(jì)數(shù)
<<<服務(wù)限流之令牌桶算法
<<<服務(wù)限流之漏桶算法
<<<漏桶算法和令牌桶算法的區(qū)別
<<<自定義封裝限流算法
<<<應(yīng)用級(jí)限流
<<<接入層限流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容