有些時候我們希望減少對數據庫的查詢來提高程序的性能,因為這些數據不是經常變更的,而是會在很長一段時間內都不會變化,因此,我們每連接一次數據庫,都會把相應的結果用文件的形式保存起來。比如對于一個商城來說,我們的商品的數量可能會經常變,但是我們的商品類型以及商品的價格這些東西都會在很長的一段時間內不會變更,如果我們需要頻繁的查詢它們的時候,就可以使用數據庫緩存技術。
緩存的原因
第一點首先看我們普通情況下執行一條SQL查詢的開銷,我們先連接數據庫,然后準備SQL查詢,接下來發送查詢信息,然后取得返回結果,最后關閉數據庫連接,這樣的話會占用較多的資源,而我們的PHP程序也因為要等待從數據庫中查詢而使得響應速度變慢。
第二點就是在數據庫壓力較大時,比如高峰時段,這個時候數據庫壓力大,我們就需要把一些數據存儲到硬盤上,用文件的形式去讀取,這樣的做法是用我們的硬盤空間換取數據庫的壓力,這一點也要看機器性能。
第三點就是有些數據不著急去更新,比如上面提到的商品類型表,就不會太急于更新,比如我們的用戶的核心信息,一般也不會輕易去修改密碼什么的,這些內容可以選擇用文件的形式去緩存起來。
緩存的實現原理
第一點就是我們要確定何時強制更新內容,最常見的有三種方式就是第一個就是用時間去觸發,我們通常使用時間戳,第二點就是發現數據庫數據被修改,則自動更新緩存,第三個就是人工觸發,我們用人工的防水告訴信息系統強制更新緩存內容。
第二點就是我們可以通過使用serialize()函數來把從數據庫中取得的數據進行序列化,保存為本地文件,然后我們通過unserialize來從本地文件中讀取信息,所謂序列化就是用特定的方式去存儲PHP的值,它會保證部丟失這些值的類型和結構。
實戰演示
我們首先把從數據庫中讀取的數據存入本地文件,代碼如下:
<?php//第一步連接數據庫$conn = mysqli_connect("localhost","root","","bbs");//第二步設置相應的字符編碼$setting = 'set names utf8';mysqli_query($conn,$setting);//第三步進行查詢$sql = 'SELECT * FROM user';$result = mysqli_query($conn,$sql);//第四步把查詢結果轉化為一個數組$rows = mysqli_num_rows($result);$sqldata = array();for($i = 0;$i <$rows;$i ++){ $sqldata[] = mysqli_fetch_assoc($result);}//第五步把結果寫到緩存文件$file = "sqlcache.txt";$msg = serialize($sqldata);$fp = fopen($file,"w");fputs($fp,$msg);fclose($fp);
a:6:{i:0;a:4:{s:2:"id";s:1:"1";s:5:"level";s:1:"0";s:4:"name";s:6:"辛星";s:3:"pwd";s:32:"bd04fcc97578ce33ca5fb331f42bc375";}i:1;a:4:{s:2:"id";s:1:"2";s:5:"level";s:1:"1";s:4:"name";s:6:"小倩";s:3:"pwd";s:32:"61cb72858be523b9926ecc3d7da5d0c6";}i:2;a:4:{s:2:"id";s:1:"3";s:5:"level";s:1:"1";s:4:"name";s:6:"小楠";s:3:"pwd";s:32:"a3d2de7675556553a5f08e4c88d2c228";}i:3;a:4:{s:2:"id";s:1:"4";s:5:"level";s:1:"1";s:4:"name";s:6:"劉強";s:3:"pwd";s:32:"fcdb06a72af0516502e5fdccc9181ee0";}i:4;a:4:{s:2:"id";s:1:"5";s:5:"level";s:1:"1";s:4:"name";s:6:"星哥";s:3:"pwd";s:32:"866a6cafcf74ab3c2612a85626f1c706";}i:5;a:4:{s:2:"id";s:1:"6";s:5:"level";s:1:"1";s:4:"name";s:6:"辛勇";s:3:"pwd";s:32:"e93beb7663f3320eaa0157730d02dd0c";}}然后我們可以寫一個程序從該文件中讀取數據,PHP代碼如下:
<?php$file = "sqlcache.txt";$msg = file_get_contents($file);$result = unserialize($msg);var_dump($result);
這樣我們的$result就是從本地的txt文件中讀取的數據,而不是從數據庫中讀取的數據了,即我們模擬了緩存的使用。
說明:
1.我們通過filemtime來得到文件的創建時間,可以用time來得到現在的時間,通過比較這個差值來決定是否要更新緩存。
2.我們可以用unlink來強制的刪除文件以清空數據緩存
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答