【說明:拷貝自我寫在公司wiki上的一篇關于緩存的文章,其中有些內(nèi)容沒有詳細介紹,只列了提綱,部分連接鏈接到了公司的wiki上,可能外網(wǎng)用戶無法打開。但是基本上介紹了常用的緩存模式,希望對你有幫助。】
- 摘要
- 2 緩存和緩存的作用
- 3 緩存類型
- 3.1 數(shù)據(jù)庫端緩存
- 3.2 應用層緩存
- 3.3 前端緩存
- 3.4 客戶端緩存
- 4 緩存的更新和過期
- 5 緩存工具介紹
- 5.1 數(shù)據(jù)庫端
- 5.2 應用層端
- 5.3 前端
- 5.4 客戶端
- 6 如何評價緩存的好壞
- 7 如何有效的使用緩存
- 8 使用緩存
- 8.1 Memcached
- 8.1.1 memcache的使用
- 8.1.2 memcache的分布式緩存
- 8.1.3 memcached的Replication
- 8.1.4 memcached的監(jiān)控
- 8.1.5 memcached的遍歷
- 8.2 Tokyo Tyrant
- 8.2.1 Tokyo Tyrant的使用
- 8.2.2 Tokyo Tyrant的Replication
- 8.2.3 Tokyo Tyrant的狀態(tài)
- 8.2.4 Tokyo Tyrant的管理
- 9 緩存的存儲
- 10 常見問題(FAQ)
- 10.1 如何更新前端緩存
- 10.2 增加memcache服務器
- 11 課題
- 11.1 鳳凰網(wǎng)BBS論壇系統(tǒng)
- 11.1.1 分析
- 11.1.2 優(yōu)化方案分析
- 11.1.3 論壇架構探討
- 11.2 鳳凰網(wǎng)BLOG博客系統(tǒng)
- 11.3 鳳凰網(wǎng)COMMENT評論系統(tǒng)
|
摘要
本文介紹了緩存的概念和在web開發(fā)中緩存的作用,以及如何使用緩存。并用鳳凰網(wǎng)的互動產(chǎn)品作為實例來分析。
緩存和緩存的作用
什么是緩存?
緩存就是用來避免頻繁的到主存儲器(一般來說可能是數(shù)據(jù)庫,結構化的磁盤文件,遠程網(wǎng)絡接口,程序接口等等提供數(shù)據(jù)返回的)獲取數(shù)據(jù)而建立的一個存 取更快的臨時存儲器(緩存)。一般來說,緩存比主存儲器更小(不一定,也可能是存儲的數(shù)據(jù)結構不一樣,但是存取速度非常快),但是存儲的容量也比較小,但 是存取速度非常快。
緩存的作用
緩存一般用來
-
- .存儲頻繁訪問的數(shù)據(jù)
- .臨時存儲耗時的計算結果
- .內(nèi)存緩存減少磁盤IO
緩存類型
在WEB開發(fā)中,緩存可以分為:
數(shù)據(jù)庫端緩存
- 這個可以用以“空間換時間”來說。比如建一個表來存儲另外一個表某個類型的數(shù)據(jù)的總條數(shù),在每次更新數(shù)據(jù)的時候同事更新 數(shù)據(jù)表和統(tǒng)計條數(shù)的表。在需要獲取某個類型的數(shù)據(jù)的條數(shù)的時候,就不需要select count去查詢,直接查詢統(tǒng)計表就可以了,這樣可以提高查詢的速度和數(shù)據(jù)庫的性能。
應用層緩存
-
- 應用層緩存這塊跟開發(fā)人員關系最大,也是平時經(jīng)常接觸的。
- .緩存數(shù)據(jù)庫的查詢結果,減少數(shù)據(jù)的壓力。這個在大型網(wǎng)站是必須做的。
- .緩存磁盤文件的數(shù)據(jù)。比如常用的數(shù)據(jù)可以放到內(nèi)存,不用每次都去讀取磁盤,特別是密集計算的程序,比如中文分詞的詞庫。
- .緩存某個耗時的計算操作,比如數(shù)據(jù)統(tǒng)計。
- .嵌入式,也就是緩存和應用在同一個機器。比如單機的文件緩存,java中用hashMap來緩存數(shù)據(jù)等等。這種緩存速度快,沒有網(wǎng)絡消耗。
- .分布式緩存,把緩存的數(shù)據(jù)獨立到不同的機器,通過網(wǎng)絡來請求數(shù)據(jù),比如常用的memcache就是這一類。
- 分布式緩存一般可以分為幾種:
- .按應用切分數(shù)據(jù)到不同的緩存服務器,這是一種比較簡單和實用的方式。
- .按照某種規(guī)則(hash,路由等等)把數(shù)據(jù)存儲到不同的緩存服務器
- .代理模式,應用在獲取數(shù)據(jù)的時候都由代理透明的處理,緩存機制有代理服務器來處理
前端緩存
我們這里說的前端緩存可以理解為一般使用的cdn技術,利用squid等做前端緩沖技術,主要還是針對靜態(tài)文件類型,比如圖片,css,js,html等靜態(tài)文件。
客戶端緩存
瀏覽器端的緩存,可以讓用戶請求一次之后,下一次不在從服務器端請求數(shù)據(jù),直接從本地緩存讀取,可以減輕服務器負擔也可以加快用戶的訪問速度。
緩存的更新和過期
我們這幾只講應用層的緩存。在應用層的緩存由于應經(jīng)有新的數(shù)據(jù)加入,數(shù)據(jù)的修改,數(shù)據(jù)的刪除等等操作,而在某些時間,我們需要這些操作及時的生效(由于用了緩存,可能會導致修改后緩存沒有更新,而頁面也沒有變化),所以出現(xiàn)緩存的更新和過期的概念。
緩存的過期
- 緩存的過期包含
- .時間過期
我們在緩存數(shù)據(jù)的時候我們可以指定數(shù)據(jù)緩存的最大時間,如果超過這個時間,我們就認為緩存是失效的。
-
- .基于規(guī)則的過期
我們在緩存中存儲了某些數(shù)據(jù)來標明數(shù)據(jù)的版本。比如存取的時間,更新的時間,數(shù)據(jù)的版本信息等等。
然后比較這些信息是否有變化來判斷是否過期。
緩存的更新
-
- .被動
- 當緩存失效的時候我們的應用程序重新從主存儲器中取數(shù)據(jù),然后重新放回緩存中。
- .主動
- 當數(shù)據(jù)一更新的時候,我們的應用主動的去更新我們的緩存內(nèi)容。
- .被動和主動結合(基于版本)
- 當數(shù)據(jù)以更新的時候,我們更新一個數(shù)據(jù)被更新的標志。然后根據(jù)上面講到的“基于規(guī)則的過期”來更新數(shù)據(jù)。
數(shù)據(jù)庫端
- 普通表,利用普通表來緩存一些統(tǒng)計數(shù)據(jù)。
- 內(nèi)存表
應用層端
比較常見的應用層分布式緩存容器,Memcache、共享文件服務器、MemcacheDb、Tokyo Tyrant。 php里面也有比如x-cache,apc等的基于進程的緩存,這種緩存比分布式緩存速度快,但是限于跟應用的一個機器。 java實現(xiàn)的緩存也比較多,比如oscache,jcache ,ehcached等等。
前端
- 前端比較常用的就是squid,Varnish Cache,ncache等等。
Varnish是一款高性能的開源HTTP加速器,挪威最大的在線報紙 Verdens Gang (vg.no) 使用3臺Varnish代替了原來的12臺squid,性能比以前更好。
客戶端
- 客戶端緩存依賴于瀏覽器的實現(xiàn),目前一般的瀏覽器都實現(xiàn)了基于http都信息來緩存相應的文件。
速度
- 當然,我們使用緩存的目的之一就是要提高我們應用的速度。如果使用緩存后速度更慢那就沒有緩存的必要了。取緩存的速度應 當是非常快的,因為緩存的工作僅僅是取出一個曾經(jīng)存儲好的數(shù)據(jù)。所以影響緩存速度的因素可能跟緩存所才采用的存儲方式有關系,還有可能印象速度的就是分布 式緩存的網(wǎng)絡消耗,同樣,緩存服務器在并發(fā)很大的時候也有可能不堪重負出現(xiàn)瓶頸,變得緩慢。
比如目前鳳凰論壇使用的帖子緩存的響應時間在亞毫秒級,也就是還不足1ms的響應時間,這個速度是相當快的。
及時性
- 我們使用緩存的重要一點就是對我們的數(shù)據(jù)的更新需要緩存也及時的更新。這點非常重要,關系到頁面顯示的正確性,用戶體驗等。
命中率
- 命中率直接關系到緩存所起到的作用的大小。如果命中率太低就相當于沒有使用緩存,或者我們的緩存的規(guī)則有問題,重視命中不到緩存。
哪些地方需要緩存
-
- .頁面的打開速度非常慢,每一次都要進行大量的計算,從數(shù)據(jù)庫取一個比較耗時操作的數(shù)據(jù)。
- .頻繁的讀取操作,每次請求都要從數(shù)據(jù)庫讀取數(shù)據(jù),而這些數(shù)據(jù)的更新并不是很頻繁,導致數(shù)據(jù)庫的壓力非常大。
- .頻繁的寫入操作(需要寫到數(shù)據(jù)庫),比如頁面點擊量,投票數(shù)的操作。這些操作可以暫時利用緩存,然后定期的寫到數(shù)據(jù)庫。
選擇什么緩存
- 緩存如此有用,那么這么多的緩存產(chǎn)品,我們?nèi)绾芜x擇呢?下面我們主要就常用的php方面來說。
- .訪問量不是特別大,web前端機器只有一臺,對數(shù)據(jù)庫端的內(nèi)容緩存可以使用文件緩存,這種方式非常簡單也比較有效,不需要對服務器做特別的配置。
- 也可以使用apc,x-cached等提供的內(nèi)存緩存,也非常有效,它比磁盤緩存速度快,但是因為是內(nèi)存緩存,所以緩存的容量有限。
- .訪問量比較大,web前端機器一般超過一臺甚至更多,我們一般采用分布式的緩存。我們一般選擇memcache作為我們的緩存,memcache是一個基于內(nèi)存的分布式緩存,它的速度和效率非常高。
- 其實這里也可以使用共享的磁盤緩存,但是基于我們目前所處的環(huán)境和對于可靠性,高并發(fā)的要求,我們不建議或者說不考慮使用共享磁盤作為緩存。
使用緩存
Memcached
memcache的使用
memcache的分布式緩存
memcached的Replication
- repcached 是一組給 memcached 1.2.x 添加數(shù)據(jù)復制功能的 patch.主要目的是建立一個冗余的memcached系統(tǒng), 當然, 還有 Fail over(失敗轉移).支持所有的memcached命令. 當master掛掉的時候,slave會頂上來.連接時能夠完整復制數(shù)據(jù).
memcached的監(jiān)控
memcached的遍歷
Tokyo Tyrant
Tokyo Tyrant的使用
Tokyo Tyrant的Replication
Tokyo Tyrant的狀態(tài)
Tokyo Tyrant的管理
緩存的存儲
Berkeley DB
CDB
CDB非常快,但是不可更新。php已經(jīng)支持。
常見問題(FAQ)
如何更新前端緩存
- 前端緩存在應用層的上方,對應用來講,一般是不可見的。比如squid控制的緩存。由此,就會出現(xiàn)一個問題。比如我們網(wǎng)站的金喜正規(guī)買球,里面有 很多的css,js文件,這些 css,js文件都可以被緩存在squid中,比如我們緩存30天,這些文件很可能30天都不會更新一次,但是,當我們需要更新某個css,js文件時怎 么辦?
增加memcache服務器
標簽:
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園