數據庫緩存層如何優化
對于大型站點,如果沒有中間緩存層,當流量打入數據庫底層時,即便有之前的幾層為我們擋住一部分流量,但是在大并發的情況下,還是有大量請求涌入數據庫層,這樣對數據庫服務器的壓力沖擊很大,響應速度也會下降,因為添加中間緩存層很有必要。
常見的緩存形式:內存緩存,文件緩存
緩存數據是為了讓客戶端很少甚至不訪問數據庫服務器進行數據的查詢,高并發下,能***程度的降低對數據庫服務器的訪問壓力
用戶請求→數據查詢→連接數據庫服務器并查詢數據→將數據緩存起來→(HTML,內存,JSON、序列化數據)→顯示
用戶再次請求→數據查詢→直接從緩存中獲取數據→顯示給客戶端
MySQL的查詢緩存
- query_cache_type 查詢緩存類型,有0,1,2三個取值 0則是不使用查詢緩存,1為始終使用查詢緩存,2表示按需使用查詢緩存 為0就沒啥好說的了
- 當query_cache_type 為1的時候,還是可以關閉掉查詢緩存的,就是:SELECT SQL_NO_CACHE * FROM MY_TABLE WHERE condition;
- 當query_cache_type 為2的時候,要按需要來開啟,開啟sql為:SELECT SQL_CACHE * FROM MY_TABLE WHERE condition;
- query_cache_size 默認情況下query_cache_size為0,表示為查詢緩存預留的內存為0,則無法使用查詢緩存
- 可以直接在my.ini(window底下,linux下是my.cnf)修改值,也可以用命令 SET GLOBAL query_cache_size = 268435456
- 查詢緩存可以看成是SQL文本和查詢結果的映射,當第二次查詢的sql語句和***次查詢的sql語句完全一樣的情況下,才會使用緩存 (多一個空格都不行呢)
- show STATUS LIKE 'QCACHE_HITS' ; 可以查看***次數
- 當表的結構和數據發生改變的時候,查詢緩存中的數據不再有效。
- 清理緩存 FLUSH QUERY CACHE; 可以清理查詢緩存內存碎片
- RESET QUERY CACHE; 從查詢緩存中移出所有查詢
- FLUSH TABLES; 關閉所有打開的表,同時該操作將會清空所有查詢緩存中的內容。
使用Memcache 緩存查詢數據
工作原理 memcache是一個高性能的分布式內存對象緩存系統,通過在內存里維護一個統一的巨大hash表,它能夠用來存儲各種格式的數據,包括圖像,視頻,文件以及數據庫檢索的結果,簡單的說就是將數據調用到內存,然后從內存中讀取,從而大大提高讀取速度。
工具流程
先檢查客戶端的請求數據是否在mamcached中,如有,直接把請求數據返回,不再對數據庫進行任何操作;如果請求的數據不在mamcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到mamcached中。
方法
- 獲取get(key)
- 設置set(key,val,expire)
- 刪除delete(key)
- 通用緩存機制 用查詢的方法名+參數作為查詢時的key,value對中的key值
詳細可以看php的memcache拓展
或者是mamcached(支持的方法多一點)
使用redis緩存查詢數據
與memcache區別
- 性能相差不大
- REDIS在2.0版本后增加了自己的VM特性,突破物理內存的限制,memcache可以修改***可用內存,采用LRU算法
- redis,依賴客戶端來實現分布式讀寫
- memcache本身沒有數據冗余機制
- redis支持(快照,aof),依賴快照進行持久化,aof增強了可靠性的同時,對性能有影響
- memcache不支持持久化,通常做緩存,提升性能。
- memcache在并發場景下,用cas保證一致性,redis事務支持比較弱,只能保證事務中的每個操作連續執行
- redis支持多種類的數據類型
- redis用于數據量較小的高性能操作和運算上
- memcache用于動態系統中減少數據庫負載,提升性能;適合做緩存,提升性能。



















