有些時候我們希望減少對數據庫的查詢來提高程序的性能,因為這些數據不是經常變更的,而是會在很長一段時間內都不會變化,因此,我們每連接一次數據庫,都會把相應的結果用文件的形式保存起來。比如對於一個商城來說,我們的商品的數量可能會經常變,但是我們的商品類型以及商品的價格這些東西都會在很長的一段時間內不會變更,如果我們需要頻繁的查詢它們的時候,就可以使用數據庫緩存技術。
緩存的原因
第一點首先看我們普通情況下執行一條SQL查詢的開銷,我們先連接數據庫,然后准備SQL查詢,接下來發送查詢信息,然后取得返回結果,最后關閉數據庫連接,這樣的話會占用較多的資源,而我們的PHP程序也因為要等待從數據庫中查詢而使得響應速度變慢。
第二點就是在數據庫壓力較大時,比如高峰時段,這個時候數據庫壓力大,我們就需要把一些數據存儲到硬盤上,用文件的形式去讀取,這樣的做法是用我們的硬盤空間換取數據庫的壓力,這一點也要看機器性能。
第三點就是有些數據不着急去更新,比如上面提到的商品類型表,就不會太急於更新,比如我們的用戶的核心信息,一般也不會輕易去修改密碼什么的,這些內容可以選擇用文件的形式去緩存起來。
緩存的實現原理
1. 使用mysql自帶查詢緩存
mysql> show variables like '%query%' ;
- query_cache_type 設置為1時默認開啟緩存,可以使用
SELECT SQL_NO_CACHE * FROM my_table WHERE condition ;
來關閉緩存
- query_cache_type 設置為1時默認開啟緩存,可以使用
SELECT SQL_CACHE * FROM my_table WHERE condition ;
來開啟緩存
mysql查詢緩存缺點
- 查詢緩存可以看作是SQL語句和結果的映射,所以必須保證SQL語句一模一樣才能使用到緩存
- 當數據或者結構發生變化時,緩存失效
2. 使用 redis or memcache 進行緩存
第一點就是我們要確定何時強制更新內容,最常見的有三種方式就是第一個就是用時間去觸發,我們通常使用時間戳,第二點就是發現數據庫數據被修改,則自動更新緩存,第三個就是人工觸發,我們用人工的防水告訴信息系統強制更新緩存內容。
第二點就是我們可以通過使用serialize()函數來把從數據庫中取得的數據進行序列化,保存為本地文件,然后我們通過unserialize來從本地文件中讀取信息,所謂序列化就是用特定的方式去存儲PHP的值,它會保證部丟失這些值的類型和結構。
redis 和 memcache 區別
- 二者都是內存緩存,性能相差不大
- redis支持持久化,memcahe沒有
- redis數據類型豐富