什麼是數據庫緩存
數據庫的數據都存儲在磁盤中,在高併發場景下,業務應用對MySQL產生的增刪改查操作造成巨大的IO開銷和查詢壓力,這無疑對數據庫和服務器都是一種巨大的壓力,爲了解決此類問題,緩存數據的概念應運而生。
常見的緩存形式:內存緩存、文件緩存。
- 極大地解決數據庫服務器的壓力
- 提高應用數據的響應速度
爲什麼要使用緩存
緩存數據是爲了讓客戶端很少甚至不訪問數據庫服務器進行數據的查詢,高併發下,能最大程度地降低對數據庫服務器的訪問壓力。
緩存方式的選擇、緩存場景的選擇、緩存數據的實時性、緩存數據的穩定性
使用MySQL查詢緩存
啓用MySQL緩存,極大地降低CPU使用率。
query_cache_type : 0不使用、1始終使用、2按需使用
Select SQL_NO_CACHE * from ...
Select SQL_CACHE * from ...
query_cache_size : 緩存內存大小,默認爲0
SET GLOBAL query_cache_size = 134555;
可以看做SQL文本和查詢結果的映射,第二次查詢的SQL和第一次查詢的SQL完全相同,則會使用緩存。
show status like 'Qcache_hits'; //查看命中次數
表的結構或數據發生改變時,查詢緩存中的數據不再有效。
//清理緩存
flush query cache;//清理查詢緩存內存碎片
reset query cache;//從查詢緩存中移出所有查詢
flush tables;//關閉所有打開的表,同時清空查詢緩存中的內容
使用Memcache緩存
對於大型站點,如果沒有中間緩存層,當流量打入數據庫層時,在大併發的情況下,還是會有大量請求湧入數據庫層,對數據庫服務器的壓力衝擊很大,響應速度也會下降,因此添加中間緩存層很有必要。
memcache是一套分佈式的高速緩存系統,由LiveJournal的 Brad Fitzpatrick 開發,目前被許多網站使用以提升網站的訪問速度,尤其對於一些大型的、需要頻繁訪問數據庫的網站提升效果十分顯著。
內存對象緩存系統,通過在內存裏維護一個統一的巨大的hash表,能夠用來存儲各種格式的數據,包括圖像、視頻、文件、數據庫檢索的結果等。
get(key)
set(key, value, expire)
delete(key)
通用緩存機制:用查詢的 方法名+參數 作爲查詢時的 key 值
PHP的memcache擴展、memcached擴展
使用Redis緩存
- 與Memcache相比,性能相差不大
- Redis2.0增加了VM特性,突破物理內存的限制
- Memcache可以修改最大可用內存,採用LRU算法
- Redis,依賴客戶端來實現分佈式讀寫
- Memcache本身沒有數據冗餘機制
- Redis支持(快照、AOF),依賴快照進行持久化,AOF增強了可靠性,不過對性能有所影響
- Memcache不支持持久化,通常做緩衝,提升性能
- Memcache在併發場景下,用cas保證一致性
- Redis事務支持比較弱,只能保證事務中的每個操作連續執行
- Redis支持多種類的數據類型
- Redis用於數據量較小的高性能操作和運算上
- Memcache用於在動態系統中減少數據庫負載,提升性能