/**
*
* 關於對web服務器緩存(控制期)
*
*
1.web緩存對靜態仍是動態內容的過時檢查
可能你們對我在上一章中講到,內容與HTTP頭分開存儲的, http頭中 標記就是判斷過時檢查的其實就是創建在http協議上的html
舉例PHP腳本: 若是要爲一個動態內容指定有效期。
仍然要在 Http響應頭中追加Expires標記,若是你對這個動態內容不要這個動態內容緩存的話,那麼最簡單的辦法就是讓
header("Expires: 0");
這樣web服務器就不會把這個動態內容發到緩存區
Look下面代碼:
*
**/
$mod_time = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
if (strtotime($mod_time) + 20 > time()) {
header("HTTP/1.1 304");
exit();
}
header("Last-Modified:".gmdate("D, d M Y H:i:s")."GMT");
header("Cache-Control: max-age=10");
echo time();
/**
* 關閉服務器磁盤緩存, 那麼上面代碼每到20秒纔到服務器去取數據(這個代 碼應該不須要我講吧)
*
*
如今我開啓服務器緩存後,這就意味着劉謙器與動態內容之間
增長了一塊緩存區
咱們如今不斷刷新,其結果也剛纔是同樣的
說白了就是 我們的意思就是20後去請求原程序。
1.Last-Modified ,若是動態內容HTTP協議的頭中包含了,Last-Modified ,那麼web服務器緩存區的最大默認時間就是這個
2.配置mod_cache:(手冊可見)
cacheMaxExpire 3600
這樣 web 服務器即可以在往後與Last-Modified的時間進行比較, 判斷內容是否過時
若是動態內容中沒有Last-Modified,
處理方式就是另外一個配置
CacheIgnoreNoLastMod 若是開啓那麼動態內容將不會被緩存。
若是沒有last-Modified與Expires,那麼緩存區就不會緩存他。
這裏有個問題,上一章咱們test的時候就沒這兩個爲啥就緩存了。這是個問題?
其實啊CacheIgnoreNoLastMod 使用它的默認設置 ,就是關閉,緩存區就會記錄噹噹前時間爲If-Modified ,並其爲最大緩存時間
原本Apache mod_cache的配置
CacheIgnoreNoLastMod 這東西就關閉的
另外就是,若是有些特定的內容不須要緩存,
好比用戶登陸後成功生成的包含了登陸狀態的Cookie,這東西確定不能緩存澀
就是要跳過Web緩存區,雖然咱們能夠採用將
header("Expires: 0"); 讓他不緩存,
可是還有其餘辦法,因此這東西要看手冊你才能知道的
Mod_cache提供了:
CacheIgnoreHeaders Set-Cookie
上面的意思就是 凡是要建立瀏覽器Cookie的內容,均可以跳過緩存區,
其實說真的,有時候,我時候很迷糊的,
爲啥?
有些時候程序自身實現的頁面緩存(不少框架都有內置的緩存機制)有些時候其實就是多餘的,
緣由很簡單程序真正運行到那裏去的時候,其實也走過了,瀏覽器緩存,
web服務器緩存 好比反向代理緩存...... 而後纔會到框架仍是咱們本身寫的緩存系統,可貴你不以爲多餘麼?
並且直接告訴瀏覽器一個 Expires就能夠解決問題了。
提及來,若是實現一個基於Http緩存機制的話,這比較錯呢
若是是基於HTTP的緩存機制,那麼擴展性很好, 即便換一臺服務器,
也可使用反向代理來快速對接。
我說這些,其實說白了,這種緩存機制的本質就 以URL爲主鍵的Key->value的結構緩存
因此咱們必需要保證因此緩存的動態內容都是惟一的Url,
好比你能夠根據Http請求頭中標記來輸出不一樣的內容。你也能夠把一些標記放到Url參數中,保證URl的惟一性就能夠
我有時候忽然發現本身想實現的東西太了,可是時間也真是不等人呢,天天都忙的半死,
靜態內容與動態內容的緩存管理,已經完畢
順便再提一下緩存」文件描述符號「 這是隻是討論一下(不要太當真的)
開發經驗比較多的朋友應該知道若是平臺的的小文件過多,這樣會形成IO開銷比較高,
說白了就是磁盤尋址的問題,因此web服務器一大部分的開銷都花在這裏的,(閒扯,Lnux上不少小工具很是的不錯,裏面有追蹤工具(strace工具),這工具很厲害,好比我去磁盤目錄中打開一個文件,這個磁盤目錄中文件多的嚇人。
你用一個追蹤工具能夠看Open()開打文件的系統的調用狀況與時間,你就會明白我說的了,
若是有這樣狀況若是你的磁盤有比較好目錄結構的話,
說了吧就不要把不少小文件都放在一個目錄下
有結構分,比以年月日分 等等........
若是是這樣的目錄結構打開文件,用工具看一下,效果會好不少的,可是仍是很蛋疼,
我說的流量大web平臺
)
因此不少人會選擇把相似Sesseion這些類的小文件放到Memche中,這種選擇實際上是很對的,可是還想說一個東西
Apache的文件描述符號,其實來講呢,也沒啥好處,可是我想提一下,
說到這裏我想先回答一個朋友的問題 再說:,
問題:關於Apace磁盤緩存引擎與內存緩存引擎
其實不少朋友都會想,Apache爲啥官方推薦咱們用磁盤緩存,不用他們的內存緩存呢?
關於多進程下內存共享問題 的開銷大,這個不說,簡單來講我沒看過源碼,也看不了源碼,
說不了只是Apache社區上的有些開發者這麼說的吧,我沒有發言權利。
但有個問題是。他們官方居然說我這個磁盤緩存系統不比存儲在內存中的慢,
並且聽說還比內存緩存快呢,這一下把咱們腦海中內存比磁盤快的觀念給有點打破了
其實來講磁盤確實確定比內存慢,這點沒啥說的,
他說了2點
1.咱們多進程共享緩衝區
2.內存映射
內存映射
我想專門說一下內存映射問題,其實也就是說理論吧
你們對Linux研究比較深的人,本人除外哈,除了喜歡看一些破書的角色而已。
應該知道Linux內核提供一種能夠訪問磁盤文件的特殊方式,
它能夠將內存中地址和咱們要訪問的磁盤文件進行關聯,
從而把我對這塊內存的訪問轉換爲對磁盤的訪問 這東西就叫內存映射技術
我你們應該能大致明白啥子是內存映射了吧,繼續:
使用內存映射能夠提升I/O的性能,他無需使用read()或者write函數等系統函數來訪問文件,而是經過mmap()系統函數來創建內存與磁盤文件的關聯關係,而後像訪問內存同樣自由的訪問文件。
同志如今明白了不,繼續:
內存映射分類:
1.共享型
2.私有型
1.共享型,能夠將任何對內存的寫操做同步到磁盤文件中,
多個進程都共享任意一個進程對映入內存的修改,
這個裏有個問題就是多進程安全的問題,
其實能夠簡單理解爲多線程安全問題相似
一個文件被多個進程映射,那麼有須要有同步機制來控制
這裏就有了開銷,這樣效率就低了
2.私有性
他映射的文件只能是讀類型文件,全部不會把對內存的寫操做
同步上文件上,並且多個進程不共享修改。
再來接受一個工具,strace 工具
在Apache2.0以上都使用了內存的映射的,
好比我訪問一個小的靜態頁面,大概200字節 Url:http:/loachost/zb/x/xs/index.html
apache會選用使用內存映射來讀取,
用 strace 工具追蹤 Apache子進程的話,你就發現問題的
本機沒有strace工具沒這工具,
可是我能夠大致說一下他調用函數流程
1. Open("/zb/x/xs/index.html",常量|常量) //打開函數
2.mmap2(xxx); //映射函數 mmap2是對mmap()函數的擴展,原理同樣
3.writev(xxxxxxxx) ; //這個函數主要是不把http響應頭的信息與 200字節的正文合併,
併發送到瀏覽器端,說白了這函數就 就是瀏覽器接受到Http協議的響應頭與內容
4.munmap();//撤銷映射,
子程序大致就作這幾步,你能夠用工具追蹤一下,一追便知
順便再提一個東西,直接I/O這東西,其實本質上給內存映射沒多大差異的
順便再說一個在I/O操做中,就以java來,可是點到即止哈,
I/O操做是是否是有一個緩衝區的的概念呢 寫buffer 讀buffer StringBuffer xxxbuffer 對象呢?。
我保證你去看一下jdk手冊保證mmap都有
其實mysql 的有個Innodb_flush_method ,能夠配置innodb支持I/o直接訪問的,
跑題了,繼續說 文件描述符號
因爲有大量的小文件,即調用Open系統函數,全部咱們能夠直接
考慮將打開後的文件描述緩存到 web服務器內存中,
這個只能存在本機內存中,由於他描述的是本機上的文件資源,
Apache提供一個 擴展 mod_file_cache
我直接貼手冊上的,
Apache模塊 mod_file_cache
說明 提供文件描述符緩存支持,從而提升Apache性能
狀態 實驗(X)
模塊名 file_cache_module
源文件 mod_file_cache.c
他應該是處於試驗階段的,可是也能夠用
配置: 仍是用上面的有Url吧
CacheFile /zb/x/xs/index.htm
可是緩存文件描述符方案只適合與靜態文件
若是有對這些文件的請求,Apache將經過文件描述直接發送出去
若是是不少的話,只是寫正則模糊匹配就好了手冊有
還要重點指出的是:,
只要配置了,Apache在啓動時就會 打開這些文件
並持續到 Apache關閉爲止,有些朋友確定想到了,若是開啓Apache就意味着要打開不少文件的話,那麼內存這塊確定會帶來不少內存開銷,
還有就是文件更新的話,必需要重啓Apache纔有效哈,
緩存文件描述符對於較大的文件來不適用,
若是是大文件的話,消耗只會是在傳送中,而不是在Open,
聽起來挺沒用的噶
我相信有些站點是能夠用的,只是我還沒用過吧,畢竟我們瞭解他的原理,
說不定那天還真能用呢,其實這個緩存文件描述符思想挺好的
我建議能夠ab工具測試一下配置先後差異與strace工具配合
完結了.......................................
*
*/
java