有些時候我們希望減少對數據庫的查詢來提高程序的性能,因為這些數據不是經常變更的,而是會在很長一段時間內都不會變化,因此,我們每連接一次數據庫,都會把相應的結果用文件的形式保存起來。比如對於一個商城來說,我們的商品的數量可能會經常變,但是我們的商品類型以及商品的價格這些東西都會在很長的一段時間內不會變更,如果我們需要頻繁的查詢它們的時候,就可以使用數據庫緩存技術。
緩存的原因
第一點首先看我們普通情況下執行一條SQL查詢的開銷,我們先連接數據庫,然後准備SQL查詢,接下來發送查詢信息,然後取得返回結果,最後關閉數據庫連接,這樣的話會占用較多的資源,而我們的PHP程序也因為要等待從數據庫中查詢而使得響應速度變慢。
第二點就是在數據庫壓力較大時,比如高峰時段,這個時候數據庫壓力大,我們就需要把一些數據存儲到硬盤上,用文件的形式去讀取,這樣的做法是用我們的硬盤空間換取數據庫的壓力,這一點也要看機器性能。
第三點就是有些數據不著急去更新,比如上面提到的商品類型表,就不會太急於更新,比如我們的用戶的核心信息,一般也不會輕易去修改密碼什麼的,這些內容可以選擇用文件的形式去緩存起來。
緩存的實現原理
第一點就是我們要確定何時強制更新內容,最常見的有三種方式就是第一個就是用時間去觸發,我們通常使用時間戳,第二點就是發現數據庫數據被修改,則自動更新緩存,第三個就是人工觸發,我們用人工的防水告訴信息系統強制更新緩存內容。
第二點就是我們可以通過使用serialize()函數來把從數據庫中取得的數據進行序列化,保存為本地文件,然後我們通過unserialize來從本地文件中讀取信息,所謂序列化就是用特定的方式去存儲PHP的值,它會保證部丟失這些值的類型和結構。
實戰演示
我們首先把從數據庫中讀取的數據存入本地文件,代碼如下:
然後我們可以打開這個sqlcache.txt文件,它的內容如下: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代碼如下:這樣我們的$result就是從本地的txt文件中讀取的數據,而不是從數據庫中讀取的數據了,即我們模擬了緩存的使用。
說明:
1.我們通過filemtime來得到文件的創建時間,可以用time來得到現在的時間,通過比較這個差值來決定是否要更新緩存。
2.我們可以用unlink來強制的刪除文件以清空數據緩存