緩存 緩存就是數據交換的緩衝區(稱做Cache)php
客戶端:緩存(expires)、deflate壓縮 緩存服務器:CDN/cache緩存靜態內容如:html、jpg、gif、js等 靜態web服務器:Apache/nginx靜態服務器提供html頁面內容 php、java 服務器:PHP/JAVA動態內容 數據庫緩存服務器:數據庫緩存memcache/redis 數據庫服務器:MYSQL數據庫 數據存儲:NFS/HADOOP等
緩存工做的原則,就是 「引用的局部性」,這能夠分爲時間局部性和空間局部性。html
CPU 緩存、網絡緩存、磁盤緩存、數據緩存、WEB緩存等。java
web 應用緩存場景 mysql
訪問一個地址 從瀏覽器緩存 路由緩存 DNS緩存 遞歸搜索 web緩存 數據緩存nginx
1、HTTP 緩存:web
一、HTTP 協議 超文本傳輸協議 redis
HTTP 報文就是瀏覽器和服務器間通訊時發送及響應的數據塊。
瀏覽器向服務器請求數據,發送請求(request)報文;服務器向瀏覽器返回數據,返回響應(response)報文。
報文信息主要分爲兩部分:
A、包含屬性的首部(header) 附加信息(cookie,緩存信息等)與緩存相關的規則信息,均包含在header中;
B、包含數據的主體部分(body) HTTP請求真正想要傳輸的部分;算法
HTTP 緩存有多種規則,Expires ;經過web 服務器實現緩存機制。sql
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後過時 }
2、應用場景方式緩存分類有三大類
A、數據庫緩存
B、靜態緩存
C、動態緩存
1、數據庫緩存:
一、MongoDB:是文檔型的非關係型數據庫,使用bson結構。其優點在於查詢功能比較強大,能存儲海量數據,缺點是比較消耗內存。使用os mmap機制緩存數據文件 因此會耗盡系統資源全部內存。
方案:集羣多副本集;
應用:通常用來存放評論等半結構化數據,支持二級索引。 適合存儲json類型數據,不常常變化。用於對象及JSON數據的存儲:Mongo 的BSON 數據格式很是適合文檔化格式的存儲及查詢。
場景: 資訊 新聞;
二、Redis:內存 緩存技術 主要規則是 key-value存儲系統;支持備份;還支持list,set,sorted set,hash 等衆多數據結構。Redis使用單線程的IO複用模型,和Memcached相似,但它支持存儲的value類型相對更多支持不一樣的排序 算法;能夠將內存中的數據保持在磁盤中。
方案:通常主從模式,3.0以後集羣哨兵模式;或者twemproxy部署簡單快捷;能夠直接在proxy進行讀寫、並轉發請求給後端的redis;可是不適合超大流量系統。
應用:適合小數據文件 當數據不能剔除,數據須要落地時,redis更合適 相似用戶信息文件;
三、Memcache:都是基於內存緩存技術 關係型數據緩存。
方案:也是分佈式集羣
原理:Memcached是多線程,非阻塞IO複用的網絡模型,分爲監聽主線程和worker子線程,Memcached 用一致性哈希環的方式,在客戶端計算出分佈位置。
應用:memacached基本上只支持kv存儲,不支持枚舉,持久化和複製等功能;
場景:視頻信息資料 100K大數據文件;內存利用率比較高。
四、消息隊列
2、靜態緩存
一、客戶端緩存
瀏覽器緩存,也就是客戶端緩存;通常是在 web 服務器上配置;
應用:
a、常見的nginx 的 expires 設置一個時間緩存;請求常見的 304 狀態;請求未改動。
b、jsp 文件html 標籤 expires
三、服務器端的靜態緩存
服務器端也是主要分爲磁盤緩存和內存緩存兩大類;
一、Squid
squid 代理服務器;
場景應用:緩存靜態頁面和html 文件 圖片 流媒體 等 ;(通常會禁止CGI 緩存)會緩存到內存和硬盤中;
a、透明代理 也是正向代理 不須要設置客戶端 只設置網關服務器設置;
b、反向代理 結合智能DNS 實現的基本的CDN( 內容分發網絡)框架;
squid 主要負責提供緩存加速以及訪問控制;正向代理是對用戶的一種代理操做。正向代理緩存 應用內部網絡但願訪問外部網絡時緩存頁面數據。
二、Varnish
varish是之內存做爲共享容器的:內存緩存;內存的大小決定了它的緩存容量。相對於主要以硬盤爲存儲的squid來講要高效的多。它適合一些常常查詢且變化不大的靜態內容緩存。
Varnish與通常服務器軟件相似,分爲master(management)進程和child(worker,主要作cache的工做)進程;master進程讀入命令,進行一些初始化,而後fork並監控child進程。child進程分配若干線程進行工做,主要包括一些管理線程和不少woker線程。
三、CDN 內容分發網絡
儘量的避開互聯網上有可能影響數據傳輸的速度和穩定性的環節和瓶頸,導向離客戶最近的服務點。解決網絡擁擠,提升響應速度。
CDN 是屬於靜態緩存加速。
CDN 是基於傳統 nginx、squid、varnish 等 web 緩存技術,結合 DNS 智能解析的靜態緩存加速技術。
CDN 的靜態緩存技術核心主要在於兩點:
節點緩存:對須要加速的網站應用,相應的靜態資源經過內存緩存+磁盤緩存的方式緩存在服務器端。
精準調度:對訪問的用戶 ip 進行智能解析調度,實現就近緩存節點訪問。
四、數據庫 mysql 一主多從或者多主多從。
五、磁盤存儲;raid ;分佈式文件系統 nfs mfs hadoop dhfs
3、緩存 回收策略機制
一、基於空間
達到必定存儲空間 按照策略移除數據。
二、基於容量
緩存條目限制 超過將舊的數據移除
三、基於時間TTL 活存期限 設置一個時間段TTI 空閒期 數據多久沒有沒有訪問將從緩存中移除。