上一篇 <<<動(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í)限流
<<<接入層限流
