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