一 ?常見的緩存形式 :
1.文件緩存 (為了避免I/O開銷,盡量使用內存緩存)
2.內存緩存
?
二 為什么要使用緩存
緩存數據是為了讓客戶端很少甚至不訪問數據庫服務器進行的數據查詢,高并發下,能最大程度降低對數據庫服務器的訪問壓力
一般的數據請求:
用戶請求->數據查詢->連接數據庫服務器并查詢數據->將數據緩存起來(緩存方式: HTML , 內存 , [JSON, 序列化數據不做考慮])->顯示給客戶端
用戶再次請求或者新用戶訪問->數據查詢->直接從緩存中獲取數據->顯示給客戶端
?
三 緩存需要考慮的方面
1.緩存方式的選擇: 對I/O開銷比較小的方式, 比如緩存到內存
2.緩存場景的選擇: 一些不經常修改的數據適合做緩存
3. 緩存數據的實時性:?
4. 緩存數據的穩定性:?
?
四 ?Mysql的查詢緩存
1.啟用mysql查詢緩存:
--(1) query_cache_type : 0代表使用查詢緩存 1表示始終使用查詢緩存 2表示按需使用查詢緩存
--(2) 如果選擇1也就是始終緩存時,如果某一條sql語句不想使用緩存,可以這樣
select SQL_NO_CACHE * from student where condition;
--(3) 如果選擇2也就是按需使用查詢緩存時,可以這樣
select SQL_CACHE *from student where condition;
2. query_cache_size 配置項
默認情況下,query_cache_size為0,也就是表示為查詢緩存預留的內存為0,表示無法使用查詢緩存
(1) 可以通過 set GLOBAL query_cache_size= 來臨時設置
(2) 也可以在配置文件中,直接設置query_cache_size的大小
3. 查詢緩存可以看做是SQL文本和查詢結果的映射
第二次查詢的sql和第一次查詢的sql完全相同,則會使用緩存
4. 我們可以通過show status like 'Qcache_hits'; 命令來查看命中次數
5. 在mysql數據緩存中,除了sql語句改變會使緩存無法使用,當表的結構或數據發生改變時,查詢緩存中的數據也不再有效
總結:如果寫的頻率較高,mysql查詢緩存意義就不大,如果數據基本不發生改變,mysql查詢緩存還是比較有用的
6.清理緩存
FLUSH QUERY CACHE; //清理查詢里的緩存內存碎片
RESET QUERY CACHE; //從查詢緩存中移出所有查詢
FLUSH TABLES; //關閉所有打開的表,同時該操作將會清空查詢緩存中的內容
?
五 使用Memcache 緩存查詢數據
?
1.memcache的概念
?memcache是一套分布式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網站使用以提升網站的訪問速度,尤其對于一些大型的、需要頻繁訪問數據庫的網站訪問速度提升效果十分顯著 。
?
2.memcache 的工作原理
Memcache是一個高性能的分布式的內存對象緩存系統,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然后從內存中讀取,從而大大提高讀取速度
?
3. memcache工作流程
先檢查客戶端的請求數據是否在memcached中,如有,直接把請求數據返回,不再對數據庫進行任何操作;如果請求的數據不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到memcached中
?
4.memcache的安裝
如果沒有以下memcache文件,點擊鏈接下載
(1) 首先,獲取memcached.exe以及msvcr71.dll(這是memcache的依賴文件),如圖
?
?
(2) 在memcached所在目錄的命令行下運行memcached.exe
(3)檢查任務管理器, 驗證memcached是否已經開始運行
如果任務進程出現這樣的圖標,說明memcached已經在運行了,到這里結束!
?
當然,這種運行方式使用上不是太方便,每次還要在命令行上運行,所以,有另一種方式讓memcached運行而不用每次都開啟cmd窗口,見下文
(2) ?以管理員身份運行cmd,將memcached安裝到服務上(將上面的第(2)步替換掉 )
(3) 查看服務中是否有memcached(將上面的第(3)步替換掉 )
將其啟動即可
?
注意:如果想要從服務中卸載掉memcached,需要先將memcached服務停止,然后再命令行下輸入如下命令即可卸載
?
5. 在php中操作memcache(需要安裝memcache拓展,安拓展是一個php程序員最基礎的東西,這里不贅述了)
(1) 連接memcache
?
$mem = new memcache();
$re=$mem->connect('localhost', 11211);
if($re){echo '連接memcache成功';
}else{echo '連接失敗';
}
瀏覽器輸出:連接memcache成功 ?證明連接memcache成功
?
?
(2) 現在,可以操作memcache數據庫了
具體方法可以參考memcache文檔?,?memcached文檔
(3) 使用遠程協議進行連接memcache的幾種方式
第一種:可以開啟telnet,然后在cmd命令行模式下使用telnet遠程連接memcache
第二種:使用putty(支持telnet的客戶端)
第三種: ?圖形界面客戶端
第四種: phpmemcache 服務器狀態軟件
第五種: memadmin php管理memcache的客戶端 (推薦)?鏈接
6.?memcache在項目中的具體應用?
?
六 使用redis緩存查詢數據
?-----以后再補-----
?
七 Redis 與 Memcache 的區別
1. 性能相差不大
2. Redis可以持久化數據,Memcache不行
3. Redis 的數據結構很豐富, memcache相對較少
4. Redis依賴客戶端實現分布式讀寫
5. Memcache本身沒有數據的冗余機制
6. Redis支持快照,AOF, 依賴快照進行持久化, aof增強了可靠性的同時,對性能有所影響
7. memcache不支持持久化,通常做緩存提升性能
8. memcache在并發場景下,用cas保持一致性,redis事物支持比較弱,只能保證事物中的每個操作連續執行
9. redis用于數據量較小的高性能操作和運算上; memcache用于在動態系統中減少數據庫負載,提升性能
?
八 緩存其他數據
Session ?
session_set_save_handle
?