1. 程式人生 > >數據庫緩存

數據庫緩存

相差 壓力 我們 流程 flush json 數據量 span 負載

1.What

a) mysql等一些常見的關系型數據庫的數據都存儲在磁盤當中,在高並發場景下,業務應用對mysql產生的增刪改查操作造成巨大的I/O開銷和查詢壓力,這無疑對數據庫和服務器都是一種巨大的壓力,為了解決此類問題,緩存數據的概念應運而生。

b) 極大地解決數據庫服務器的壓力

c) 提高應用數據的響應速度

d) 常見的緩存形式:內存緩存(可避免I/O開銷)、文件緩存

2.Why

a) 緩存數據是為了讓客戶端減少甚至不訪問數據庫服務器進行數據的查詢,高並發下,能最大程度地降低對數據庫服務器的訪問壓力。

b) 默認不使用緩存時的情況:用戶請求-》數據查詢-》連接數據庫服務器並查詢數據-》將數據緩存起來(

HTML、內存、JSON、序列化數據)-》顯示給客戶端

c) 用戶再次請求或者新用戶訪問-》數據查詢-》直接從緩存中獲取數據-》顯示給客戶端

註意:緩存需要考慮的內容(緩存方式的選擇、緩存場景的選擇、緩存數據的實時性)

3.使用Mysql查詢緩存(粒度小,了解下即可)

a) 啟用mysql查詢緩存 query_cache_type0:不使用1:始終使用2:按需使用)

1.query_cache_type=1時,也可以關閉查詢緩存:Select SQL_NO_CACHE * from table where condition;

2.默認情況下Query_cache_size為0,表示為查詢緩存預留的內存為0,則無法使用查詢緩存;set global

query_cache_size = 11334;//通過語句修改

b) 極大地降低CPU使用率

c) 查詢緩存可以看作是SQL文本和查詢結果的映射;第二次查詢的SQL和第一次查詢的SQL完全相同,則會使用緩存;表的結構或數據發生改變時,查詢緩存中的數據不再有效。Show status like `Qcache_hits`;//查看命中次數

d) 清理緩存

flush query cache; //清理查詢緩存內存碎片

reset query cache; //從查詢緩存中移出所有查詢

flush tables;//關閉所有打開的表,同時該操作將會清空查詢緩存中的內容

4.使用memcache緩存

對於大型站點,如果沒有中間緩存層,當流量打入數據庫層時,即便有之前的幾層為我們擋住一部分流量,但是在大並發的情況下,還是會有大量請求湧入數據庫層,這樣對於數據庫服務器的壓力沖擊很大,響應速度也會下降,因此添加中間緩存很有必要。

memcache是一套分布式的高速緩存系統,很多網站使用以提高網站的訪問速度,尤其對一些大型的、需要頻繁訪問數據庫的網站訪問速度提升效果十分顯著。

a) 工作原理

memcache是一個高性能的分布式的內存對象緩存系統,通過在內存裏維護一個統一的巨大的hash表,它能夠用來存儲各種各樣的數據,包括圖像、視頻、文件、以及數據庫檢索的結果等。簡單的說就是將數據調用到內存,然後從內存中讀取,從而大大提高讀取速度。

b)工作流程

先檢查客戶端的請求數據是否在memcached中,如有,直接把請求數據返回,不再對數據庫進行任何操作;如果請求的數據不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到memchached中。(註意過期時間)

c) get(key),set(key,val,expire),delete(key)

d) 通用緩存機制 用查詢的方法名+參數 作為查詢時的key value對中的key

5.使用redis緩存

6.比較

a) 性能相差不大

b) Redis2.0版本增加了自己的VM特性,突破物理內存的限制;memcache可以修改最大可用內存,采用LRU算法。

c) redis依賴客戶端來實現分布式讀寫;Memcache本身沒有數據冗余機制;redis支持(快照、AOF),依賴快照進行持久化,aof增強了可靠性的同時,對性能有所影響。

d) Memcache不支持持久化,通常做緩存,提升性能;memcache在並發場景下,用cas保證一致性,redis事務支持比較弱,只能保證事務中的每個操作連續執行。

e) redis支持多種類的數據類型

f) redis用於數據量較小的高性能操作和運算上。memcache用於在動態系統中減少數據庫負載,提升性能;適合做緩存,提高性能。

數據庫緩存