[TOC]
## 簡介
MysαL等一些常見的關系型數據庫的數據都存儲在磁盤當中,在高并發場景下,業務應用對 MYSQL產生的增、刪、改、查的操作造成巨大的I/O開銷和查詢壓力,這無疑對數據庫和服務器都是一種巨大的壓力,為了解決此類問題,緩存數據的概念應運而生。
## 優點
極大地解決數據庫服務器的壓力
提高應用數據的響應速度
## 常見的緩存形式
內存緩存,文件緩存
## 啟用 MYSQL查詢緩存
極大地降低CPU使用率
### `query_cache_ type`
查詢緩存類型,有0、1、2三個取值。
- 0則不使用查詢緩存。
- 1表示始終使用查詢緩存。
```
//對某一條不進行緩存
SELECT SQL_NO_ CACHE* FROM my_table WHERE condition
```
- 2表示按需使用查詢緩存。
```
//在需要緩存時,添加SQL_CACHE
SELECT SQL_CACHE * FROM my_table WHERE condition;
```
### `query_ cache_size`
默認情況下 query_cache_size為0,表示為查詢緩存預留的內存為0,無法使用查詢緩存
`SET GLOBAL query cache size =134217728;`
### 注意事項
查詢緩存可以看做是SQL文本和查詢結果的映射
第二次查詢的SQL和第一次查詢的SQL完全相同,則會使用緩存
`SHOW STATUS LIKE 'Qcache_hits;`查看命中次數
表的結構或數據發生改變時,查詢緩存中的數據不再有效
### 清理緩存
`FLUSH QUERY CACHE;`∥/清理查詢緩存內存碎片
`RESET QUERY CACHE;`/從查詢緩存中移出所有查詢
`FLUSH TABLES;`//關閉所有打開的表,同時該操作將會清空查詢緩存中的內容
## 使用 Memcache緩存查詢數據
對于大型站點,如果沒有中間緩存層,當流量打入數據庫層時,即便有之前的幾層為我們擋住一部分流量,但是在大并發的情況下,還是會有大量請求涌入數據庫層,這樣對于數據庫服務器的壓力沖擊很大,響應速度也會下降,因此添加中間緩存層很有必要。
### 工作原理
Memcache是一個高性能的分布式的內存對象緩存系統,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存,然后從內存中讀取,從而大大提高讀取速度
### 方法
獲取:`get(key)`
設置:`set(key,val, expire)`
刪除: `delete(key)`
## 使用 Redis綬存查詢數據
### 與 Memcache的區別
- 性能相差不大
- Redis在2.0版本后增加了自己的VM特性,突破物理內存的限制,Memcache可以修改最大可用內存采用LRU算法
- Redis,依賴客戶端來實現分布式讀寫
- Memcache本身沒有數據冗余機制
- Redis支持(快照、AOF),依賴快照進行持久化,aof增強了可靠性的同時,對性能有所影響
- Memcache不支持持久化,通常做緩存,提升性能;
- Memcache在并發場景下,用cas保證一致性, redis事務支持比較弱,只能保證事務中的每個操作連續執行較弱,只能保證事務中的毎個操作連續執行
- Redis支持多種類的數據類型
- Redis用于數據量較小的高性能操作和運算上
- Memcache用于在動態系統中減少數據庫負載,提升性能;適合做緩存,提高性能