php的緩存三種.有文件緩存,數據庫緩存,memcache緩存;
創新互聯主營平遙網站建設的網絡公司,主營網站建設方案,App定制開發,平遙h5微信小程序搭建,平遙網站營銷推廣歡迎平遙等地區企業咨詢
memcache緩存要求對服務器支持,而且它的緩存是由期限的,一般是30天。這種緩存的效率是最高的。讀存取的速度最快。
數據庫緩存
和
文件緩存比較簡單。適用小的項目。和php新手
函數參考
$this-db-cache_on() / $this-db-cache_off()
用于手工啟用/禁用緩存,當你不想緩存某些查詢時,這兩個方法會很有用。 例子:
// Turn caching on
$this-db-cache_on();
$query = $this-db-query("SELECT * FROM mytable");
// Turn caching off for this one query
$this-db-cache_off();
$query = $this-db-query("SELECT * FROM members WHERE member_id = '$current_user'");
// Turn caching back on
$this-db-cache_on();
$query = $this-db-query("SELECT * FROM another_table");
$this-db-cache_delete()
刪除特定頁面的緩存文件,這當你更新你的數據庫之后需要清除緩存時很有用。
緩存系統根據你訪問頁面的 URI 來將緩存寫入到相應的緩存文件中去,例如, 如果你在訪問 example點抗 /index.php/blog/comments 這個頁面,緩存系統 會將緩存文件保存到 blog+comments 目錄下,要刪除這些緩存文件,你可以使用:
$this-db-cache_delete('blog', 'comments');
如果你沒提供任何參數,將會清除當前 URI 對應的緩存文件。
$this-db-cache_delete_all()
清除所有的緩存文件,例如:
一、全頁面靜態化緩存
也就是將頁面全部生成html靜態頁面,用戶訪問時直接訪問的靜態頁面,而不會去走php服務器解析的流程。此種方式,在CMS系統中比較常見,比如dedecms;
一種比較常用的實現方式是用輸出緩存:
Ob_start()******要運行的代碼*******$content=Ob_get_contents();****將緩存內容寫入html文件*****Ob_end_clean();
二、數據緩存
顧名思義,就是緩存數據的一種方式;比如,商城中的某個商品信息,當用商品id去請求時,就會得出包括店鋪信息、商品信息等數據,此時就可以將這些數據緩存到一個php文件中,文件名包含商品id來建一個唯一標示;下一次有人想查看這個商品時,首先就直接調這個文件里面的信息,而不用再去數據庫查詢;其實緩存文件中緩存的就是一個php數組之類;
Ecmall商城系統里面就用了這種方式;
三、查詢緩存
其實這跟數據緩存是一個思路,就是根據查詢語句來緩存;將查詢得到的數據緩存在一個文件中,下次遇到相同的查詢時,就直接先從這個文件里面調數據,不會再去查數據庫;但此處的緩存文件名可能就需要以查詢語句為基點來建立唯一標示;
按時間變更進行緩存
就是對于緩存文件您需要設一個有效時間,在這個有效時間內,相同的訪問才會先取緩存文件的內容,但是超過設定的緩存時間,就需要重新從數據庫中獲取數據,并生產最新的緩存文件;比如,我將我們商城的首頁就是設置2個小時更新一次。
四、頁面部分緩存
該種方式,是將一個頁面中不經常變的部分進行靜態緩存,而經常變化的塊不緩存,最后組裝在一起顯示;可以使用類似于ob_get_contents的方式實現,也可以利用類似ESI之類的頁面片段緩存策略,使其用來做動態頁面中相對靜態的片段部分的緩存。
該種方式可以用于如商城中的商品頁;
五、Opcode緩存
首先php代碼被解析為Tokens,然后再編譯為Opcode碼,最后執行Opcode碼,返回結果;所以,對于相同的php文件,第一次運行時可以緩存其Opcode碼,下次再執行這個頁面時,直接會去找到緩存下的opcode碼,直接執行最后一步,而不再需要中間的步驟了。
比較知名的是XCache、TurckMMCache、PHPAccelerator等。
六、按內容變更進行緩存
這個也并非獨立的緩存技術,需結合著用;就是當數據庫內容被修改時,即刻更新緩存文件;
比如,一個人流量很大的商城,商品很多,商品表必然比較大,這表的壓力也比較重;我們就可以對商品顯示頁進行頁面緩存;
當商家在后臺修改這個商品的信息時,點擊保存,我們同時就更新緩存文件;那么,買家訪問這個商品信息時,實際問的是一個靜態頁面,而不需要再去訪問數據庫;
試想,如果對商品頁不緩存,那么每次訪問一個商品就要去數據庫查一次,如果有10萬人在線瀏覽商品,那服務器壓力就大了;
七、內存式緩存
提到這個,可能大家想到的首先就是Memcached;memcached是高性能的分布式內存緩存服務器。一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。
它就是將需要緩存的信息,緩存到系統內存中,需要獲取信息時,直接到內存中取;比較常用的方式就是key_value方式;
connect($memcachehost,$memcacheport)ordie("Couldnotconnect");$memcache-set('key','緩存的內容');$get=$memcache-get($key);//獲取信息?
八、apache緩存模塊
apache安裝完以后,是不允許被cache的。云南IT培訓認為如果外接了cache或squid服務器要求進行web加速的話,就需要在htttpd.conf里進行設置,當然前提是在安裝apache的時候要激活mod_cache的模塊。
對于有分頁條件的緩存,我們也可以按照不同的分頁條件來緩存多個key,比如分頁查詢產品列表,page=1limit=10和page=1limit=5這兩次請求可以這樣緩存查詢結果
productList:page:1:limit:10
productList:page:1:limit:5
這個是一種常見方案,但是存在著一些問題:
緩存的value存在冗余,productList:page:1:limit:10緩存的內容其實是包括了productList:page:1:limit:5中的內容(緩存兩個key的時候,數據未發生變化的情況下)
僅僅是改變了查詢條件的分頁條件,就會導致緩存未命中,降低了緩存的命中率
為了保證數據一致性,需要清理緩存的時候,很難處理,redis的keys命令對性能影響很大,會導致redis很大的延遲,生產環境一般來說禁止該命令。自己手動拼緩存key,你可能根本不知道拼到哪一個page為止。
放棄數據一致性,通過設置失效時間來自動失效,可能會出現查詢第一頁命中了緩存,查詢第二頁的時候未命中緩存,但此時數據已經發生了改變,導致第二頁查詢返回的和第一頁相同的結果。
以上,在分頁條件下這樣使用常規方案總感覺有諸多困擾,諸多麻煩,那是不是就應該放棄使用緩存?
基于SortedSet的分頁查詢緩存方案
首先想到的解決方法是使用@see ListOperationsK, V不再根據分頁條件使用多個key,而是使用一個key,也不分頁將全部的數據緩存到redis中,然后按照分頁條件使用range(key,start,limit)獲取分頁的結果,這個會導致一個問題,當緩存失效時,并發的寫緩存會導致出現重復數據
所以想到通過使用set來處理并發時的重復數據,@see ZSetOperationsK, V
代碼邏輯如下:
range(key,start,limit)按照分頁條件獲取緩存,命中則直接返回
緩存未命中,查詢(沒有分頁條件)數據庫或是調用(沒有分頁)底層接口
add(key,valueScoreMapvalue,score)寫入緩存,expire設置緩存時間
當需要清理緩存時,直接刪除key,如果是因為數據新增和刪除,可以add(key,value,score)或remove(key,value)
redis中會按照score分值升序排列map中的數據,一般的,score分值是sql語句的order by filedA的filedA的值,這樣能保證數據一致性
但是這種方式也存在一定問題:
這個key緩存的value確實是熱數據,但可能只有少數數據被頻繁使用其余的可能根本就未被使用,比如數據有100頁,實際可能只會用到前10頁,這也會導致緩存空間的浪費,如果使用了redis虛擬內存,也會有一定影響
sql查詢由原來的分頁查詢變成了不分頁查詢,緩存失效后,系統的處理能力較之前會有下降,尤其是對于大表.
網頁名稱:php數據庫查詢緩存 php查詢數據庫內容表格
文章分享:http://vcdvsql.cn/article28/ddsidjp.html
成都網站建設公司_創新互聯,為您提供App設計、網站營銷、關鍵詞優化、搜索引擎優化、網站改版、自適應網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯