8.1.1 為什么使用緩存
???????? 1、NoSQL指的是Not only Sql? 而不是 No Sql,作為一種統(tǒng)稱,包括了k-v的數(shù)據(jù)庫和內(nèi)存管理
?????? 2、緩存的三個要素:命中率,緩存更新策略、緩存最大數(shù)據(jù)量
8.1.2??? 命中率
?????? 1、命中率是指請求緩存次數(shù)和返回正確次數(shù)的比例。(正相關(guān))
?????? 2、Query Cache:將SQL語句以及結(jié)果做HASH映射后保存在一定的內(nèi)存區(qū)域。
?????? 3、只有Select語句會被緩存
?????? 4、命中率hit = Qcache_queries_in_cache / Com_select
?????? 5、如果數(shù)據(jù)經(jīng)常更新,QueryCache就會失效,甚至造成負(fù)擔(dān)
8.1.3??? 緩存更新策略(以Query Cache為例)
?????? 1、FIFO先進(jìn)先出策略(MySql就是使用這種)
?????? 2、LFU策略:最少使用的元素會被清理
?????? 3、LRU策略:最近最少使用的元素被清理。
8.1.4??? 緩存最大數(shù)據(jù)量
?????? 1、緩存最大數(shù)據(jù)量對于像數(shù)據(jù)庫這種,則是由參數(shù)決定;對于基于內(nèi)存的k-v,則是由OS決定的。
?????? 2、超過緩存最大數(shù)據(jù)量一般會做如下處理:
[if !supportLists]l? [endif]停止緩存服務(wù),所有緩存數(shù)據(jù)被清空
[if !supportLists]l? [endif]拒絕寫入,不再對緩存進(jìn)行更新
[if !supportLists]l? [endif]根據(jù)緩存更新策略清除舊數(shù)據(jù)
[if !supportLists]l? [endif]在上一個方案的基礎(chǔ)上,對舊數(shù)據(jù)進(jìn)行備份
8.2.1??? 文件緩存機(jī)制
?????? 1、模板的作用之一就是把動態(tài)PHP代碼“編譯”成靜態(tài)的HTML代碼,思路:
[if !supportLists]a)??????[endif]判斷是否需要緩存
[if !supportLists]b)?????[endif]判斷是否存在對應(yīng)的靜態(tài)文件
[if !supportLists]c)??????[endif]判斷靜態(tài)文件是否過期
8.2.2??? 文件緩存開源產(chǎn)品Secache
8.3 Opcode緩存
?????? 1、一個PHP運行完,所有的變量都會被回收,這樣可以避免內(nèi)存泄漏,但同樣無法復(fù)用之前的數(shù)據(jù),因此Opcode就產(chǎn)生了。
?????? 2、php的語言引擎Zend執(zhí)行php代碼時候,會把代碼經(jīng)過分成Token,詞法分析過程轉(zhuǎn)成Opcode的過程。
8.3.1??? eAccelerato下載及使用
8.4 客戶端緩存
[if !supportLists]1.??????[endif]客戶端緩存規(guī)則
[if !supportLists]a)??????[endif]如果響應(yīng)頭告訴緩存器不要緩存,緩存器就不會緩存
[if !supportLists]b)?????[endif]如果請求信息帶有認(rèn)證或者安全加密的,相應(yīng)內(nèi)容不會緩存
[if !supportLists]c)??????[endif]如果回應(yīng)中不存在校驗器(ETag或者Last-Modified頭信息),緩存服務(wù)器會認(rèn)為缺乏直接更新度信息,內(nèi)容不緩存
[if !supportLists]2.??????[endif]HTTP協(xié)議中的緩存使用
[if !supportLists]a)??????[endif]三個標(biāo)識Last-Modified?? Expires???? ETag
[if !supportLists]?????????????????????????????????????i.?????????????[endif]Expires:過期時間,HTTP的日期時間是格林威治時間GMT,而不是本地時間
[if !supportLists]???????????????????????????????????ii.?????????????[endif]Cache-Control:響應(yīng)頭信息,通過這個屬性可以讓網(wǎng)站owner全面控制內(nèi)容
[if !supportLists]?????????????????????????????????iii.?????????????[endif]ETag:服務(wù)器生成的唯一標(biāo)識符,“被請求變量的實體標(biāo)志”,給URL的唯一標(biāo)記。
[if !supportLists]b)?????[endif]一些小竅門
[if !supportLists]?????????????????????????????????????i.?????????????[endif]不經(jīng)常改變圖片或者頁面 啟用緩存,使用Cache-Control:max-age屬性設(shè)置一個較長的過期時間。
[if !supportLists]???????????????????????????????????ii.?????????????[endif]定期更新的內(nèi)容設(shè)置一個緩存服務(wù)器可識別的max-age屬性或過期時間
[if !supportLists]?????????????????????????????????iii.?????????????[endif]盡量不使用POST,因為POST返回的內(nèi)容大部分緩存服務(wù)器不會緩存。
[if !supportLists]????????????????????????????????iv.?????????????[endif]不要在URL中加入對每個用戶的識別信息