緩存 緩存就是數據交換的緩沖區(稱作Cache)
客戶端:緩存(expires)、deflate壓縮 緩存服務器:CDN/cache緩存靜態內容如:html、jpg、gif、js等 靜態web服務器:Apache/nginx靜態服務器提供html頁面內容 php、java 服務器:PHP/JAVA動態內容 數據庫緩存服務器:數據庫緩存memcache/redis 數據庫服務器:MYSQL數據庫 數據存儲:NFS/HADOOP等
緩存工作的原則,就是 “引用的局部性”,這可以分為時間局部性和空間局部性。
CPU 緩存、網絡緩存、磁盤緩存、數據緩存、WEB緩存等。
web 應用緩存場景
訪問一個地址 從瀏覽器緩存 路由緩存 DNS緩存 遞歸搜索 web緩存 數據緩存
一、HTTP 緩存:
1、HTTP 協議 超文本傳輸協議
HTTP 報文就是瀏覽器和服務器間通信時發送及響應的數據塊。
瀏覽器向服務器請求數據,發送請求(request)報文;服務器向瀏覽器返回數據,返回響應(response)報文。
報文信息主要分為兩部分:
A、包含屬性的首部(header) 附加信息(cookie,緩存信息等)與緩存相關的規則信息,均包含在header中;
B、包含數據的主體部分(body) HTTP請求真正想要傳輸的部分;
HTTP 緩存有多種規則,Expires ;通過web 服務器實現緩存機制。
Apache 緩存
mod_cache 模塊
Apache 的緩存方式也有兩種,一種是基於硬盤文件的緩存,由 mod_disk_cache 實現,另一種是使用內存緩存,由 mod_mem_cache 實現。URL 的請求方式必須是 GET 方式。
基於硬盤文件存儲的緩存 :
<IfModule mod_cache.c> CacheDefaultExpire 86400 <IfModule mod_disk_cache.c> CacheEnable disk /tmp/file CacheRoot /tmp/apacheCache CacheDirLevels 5 CacheDirLength 4 CacheMaxFileSize 1048576 CacheMinFileSize 10 </IfModule> </IfModule>
CacheDefaultExpire:設定緩存過期的時間(秒),默認是1小時,只有當緩存的文檔沒有設置過期時間或最后修改時間時這個指令才會生效.
CacheEnable:啟用緩存,第1個參數是緩存類弄,這里當然是 disk了,第2個參數是緩存路徑,指的是 url 路徑,這里是緩存所有的東西.
CacheRoot:緩存文件所在的目錄,運行 Apache 的用戶(如daemon 或 nobody)要能對其進行讀寫,如果不清楚的話可以直接設置成 777,請手動建立該目錄並設置好訪問權限
CacheDirLevels:緩存目錄的深度,默認是3,這里設置為5
CacheDirLength:緩存目錄名的字符長度,默認是4,這里設置為5
CacheMaxFileSize 和 CacheMaxFileSize: 緩存文件的最大值和最小值(byte),當超過這個范圍時將不再緩存,這里設置為 1M 和 10bytes
基於內存的緩存
<IfModule mod_cache.c> <IfModule mod_mem_cache.c> CacheEnable mem / MCacheMaxObjectCount 20000 MCacheMaxObjectSize 1048576 MCacheMaxStreamingBuffer 65536 MCacheMinObjectSize 10 MCacheRemovalAlgorithm GDSF MCacheSize 131072 </IfModule> </IfModule>
CacheEnable:啟用緩存,使用基於內存的方式存儲
MCacheMaxObjectCount:在內存中最多能存儲緩存對象的個數,默認是1009,這里設置為20000
MCacheMaxObjectSize:單個緩存對象最大為 1M,默認是10000bytes
MCacheMaxStreamingBuffer:在緩沖區最多能夠放置多少的將要被緩存對象的尺寸,這里設置為 65536,該值通常小於100000或 MCacheMaxObjectSize 設置的值
MCacheMinObjectSize:單個緩存對象最小為10bytes,默認為1bytes
MCacheRemovalAlgorithm:清除緩存所使用的算法,默認是 GDSF,還有一個是LRU,可參考 Apache 的官方文檔。
MCacheSize:緩存數據最多能使用的內存,單位是 kb,默認是100kb,這里設置為128M
Nginx 調優 配置cache 緩存 常見的 304 狀態
proxy_temp_path /tmp/proxy_temp_dir; // 設置緩存位置 proxy_cache_path /tmp/proxy_cache_dir levels = 1:2 keys_zone = cache_one:200m inactive =1d max_size =30g; // 設置緩存區名稱 內存緩存空間大小 1天內容沒有訪問自動清除 緩存設置大小 ;
Tomcat性能調優
開啟壓縮功能
compression="on"
通過ExpiresFilter設置資源緩存,可通過Expires
與 Cache-Control
控制資源何時過期。
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; res.setHeader("Cache-Control", "max-age=10"); // 第一次請求10s后過期 }
二、應用場景方式緩存分類有三大類
A、數據庫緩存
B、靜態緩存
C、動態緩存
一、數據庫緩存:
1、MongoDB:是文檔型的非關系型數據庫,使用bson結構。其優勢在於查詢功能比較強大,能存儲海量數據,缺點是比較消耗內存。使用os mmap機制緩存數據文件 所以會耗盡系統資源所有內存。
方案:集群多副本集;
應用:一般用來存放評論等半結構化數據,支持二級索引。 適合存儲json類型數據,不經常變化。用於對象及JSON數據的存儲:Mongo 的BSON 數據格式非常適合文檔化格式的存儲及查詢。
場景: 資訊 新聞;
2、Redis:內存 緩存技術 主要規則是 key-value存儲系統;支持備份;還支持list,set,sorted set,hash 等眾多數據結構。Redis使用單線程的IO復用模型,和Memcached類似,但它支持存儲的value類型相對更多支持不同的排序 算法;可以將內存中的數據保持在磁盤中。
方案:一般主從模式,3.0之后集群哨兵模式;或者twemproxy部署簡單快捷;可以直接在proxy進行讀寫、並轉發請求給后端的redis;但是不適合超大流量系統。
應用:適合小數據文件 當數據不能剔除,數據需要落地時,redis更合適 類似用戶信息文件;
3、Memcache:都是基於內存緩存技術 關系型數據緩存。
方案:也是分布式集群
原理:Memcached是多線程,非阻塞IO復用的網絡模型,分為監聽主線程和worker子線程,Memcached 用一致性哈希環的方式,在客戶端計算出分布位置。
應用:memacached基本上只支持kv存儲,不支持枚舉,持久化和復制等功能;
場景:視頻信息資料 100K大數據文件;內存利用率比較高。
4、消息隊列
二、靜態緩存
1、客戶端緩存
瀏覽器緩存,也就是客戶端緩存;一般是在 web 服務器上配置;
應用:
a、常見的nginx 的 expires 設置一個時間緩存;請求常見的 304 狀態;請求未改動。
b、jsp 文件html 標簽 expires
3、服務器端的靜態緩存
服務器端也是主要分為磁盤緩存和內存緩存兩大類;
1、Squid
squid 代理服務器;
場景應用:緩存靜態頁面和html 文件 圖片 流媒體 等 ;(一般會禁止CGI 緩存)會緩存到內存和硬盤中;
a、透明代理 也是正向代理 不需要設置客戶端 只設置網關服務器設置;
b、反向代理 結合智能DNS 實現的基本的CDN( 內容分發網絡)框架;
squid 主要負責提供緩存加速以及訪問控制;正向代理是對用戶的一種代理操作。正向代理緩存 應用內部網絡希望訪問外部網絡時緩存頁面數據。
2、Varnish
varish是以內存作為共享容器的:內存緩存;內存的大小決定了它的緩存容量。相對於主要以硬盤為存儲的squid來說要高效的多。它適合一些經常查詢且變化不大的靜態內容緩存。
Varnish與一般服務器軟件類似,分為master(management)進程和child(worker,主要做cache的工作)進程;master進程讀入命令,進行一些初始化,然后fork並監控child進程。child進程分配若干線程進行工作,主要包括一些管理線程和很多woker線程。
3、CDN 內容分發網絡
盡可能的避開互聯網上有可能影響數據傳輸的速度和穩定性的環節和瓶頸,導向離客戶最近的服務點。解決網絡擁擠,提高響應速度。
CDN 是屬於靜態緩存加速。
CDN 是基於傳統 nginx、squid、varnish 等 web 緩存技術,結合 DNS 智能解析的靜態緩存加速技術。
CDN 的靜態緩存技術核心主要在於兩點:
節點緩存:對需要加速的網站應用,相應的靜態資源通過內存緩存+磁盤緩存的方式緩存在服務器端。
精准調度:對訪問的用戶 ip 進行智能解析調度,實現就近緩存節點訪問。
4、數據庫 mysql 一主多從或者多主多從。
5、磁盤存儲;raid ;分布式文件系統 nfs mfs hadoop dhfs
三、緩存 回收策略機制
1、基於空間
達到一定存儲空間 按照策略移除數據。
2、基於容量
緩存條目限制 超過將舊的數據移除
3、基於時間
TTL 活存期限 設置一個時間段
TTI 空閑期 數據多久沒有沒有訪問將從緩存中移除。