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