偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

SQL優(yōu)化實(shí)戰(zhàn):如何通過緩存給MySQL查詢進(jìn)行流量削峰?

數(shù)據(jù)庫(kù) MySQL
大量請(qǐng)求跑到MySQL這查詢數(shù)據(jù),此時(shí)就會(huì)有大量請(qǐng)求密集請(qǐng)求數(shù)據(jù)庫(kù),然后就會(huì)導(dǎo)致數(shù)據(jù)庫(kù)所在機(jī)器的CPU和內(nèi)存占用率都飆升,最終就會(huì)導(dǎo)致MySQL查詢效率極速降低。

前 言

經(jīng)過前面索引和sql的優(yōu)化后,現(xiàn)在查詢速度快的飛起,然后,我們繼續(xù)回歸到了日常需求的開發(fā)中。

3個(gè)月過后,訂單表的數(shù)據(jù)已經(jīng)達(dá)到5000萬(wàn)了,不過sql一次查詢的時(shí)間,基本穩(wěn)定在300ms以下。

但是某個(gè)周一,leader剛開完周會(huì)就直接來(lái)找你了,直接說(shuō):“哎呀,周會(huì)上DBA找我了,說(shuō)咱們訂單組的sql偶爾會(huì)超過2s,DBA現(xiàn)在要求優(yōu)化,平均時(shí)間要優(yōu)化到300ms以下,不過,優(yōu)化前你要先查下,為什么sql的查詢時(shí)間會(huì)偶爾突增。”

問題排查

然后我們就接下了這個(gè)任務(wù),接著,我們就根據(jù)DBA給的慢sql,去查這條sql的相關(guān)日志,然后結(jié)合著監(jiān)控,最后發(fā)現(xiàn)這條sql平常一直很穩(wěn)定,但是在高峰期的時(shí)候,這條sql偶爾花費(fèi)的時(shí)間會(huì)超過2s。

此時(shí),我們又查看了一下訂單數(shù)據(jù)庫(kù)所在物理機(jī)的資源占用情況,發(fā)現(xiàn)高峰期時(shí),這臺(tái)物理機(jī)的資源占用非常高,CPU和內(nèi)存占用率都很高,這下基本就確定原因了。

說(shuō)白了,就是一到高峰期,大量請(qǐng)求跑到MySQL這查詢數(shù)據(jù),此時(shí)就會(huì)有大量請(qǐng)求密集請(qǐng)求數(shù)據(jù)庫(kù),然后就會(huì)導(dǎo)致數(shù)據(jù)庫(kù)所在機(jī)器的CPU和內(nèi)存占用率都飆升,最終就會(huì)導(dǎo)致MySQL查詢效率極速降低。

leader了解情況后說(shuō):“其實(shí)數(shù)據(jù)庫(kù)查詢慢,不一定就是MySQL數(shù)據(jù)量大導(dǎo)致的,比如當(dāng)前這個(gè)情況,明顯是大量請(qǐng)求密集請(qǐng)求數(shù)據(jù)庫(kù),造成數(shù)據(jù)庫(kù)負(fù)載變大,從而大大降低了數(shù)據(jù)庫(kù)的查詢效率,這個(gè)時(shí)候,其實(shí)我們就需要在MySQL的前邊,加上一層緩存,來(lái)進(jìn)行流量削峰,以保證MySQL能穩(wěn)定的完成查詢”

經(jīng)過leader一點(diǎn)撥,我們恍然大悟,原來(lái)是這樣,說(shuō)白了,這個(gè)時(shí)候我們可以加一些緩存,來(lái)為MySQL進(jìn)行流量削峰,添加了緩存后的運(yùn)行流程,大概是這樣的:

就是說(shuō),按照標(biāo)準(zhǔn)的請(qǐng)求流程,用戶的請(qǐng)求是會(huì)打到數(shù)據(jù)庫(kù)上的,但是加了緩存之后就不是這種流程了。這個(gè)時(shí)候請(qǐng)求可以直接從緩存中獲取到數(shù)據(jù)并返回,此時(shí)就會(huì)減少后續(xù)流程的處理,比如查詢數(shù)據(jù)庫(kù)的操作,這樣就有效降低了數(shù)據(jù)庫(kù)的負(fù)載。

說(shuō)白了,就是使用緩存來(lái)承接大多數(shù)的查詢請(qǐng)求,達(dá)到流量削峰的效果,從而降低數(shù)據(jù)庫(kù)的負(fù)載,以保證MySQL能穩(wěn)定高效的完成查詢,這樣MySQL在高峰期查詢時(shí)間突增的問題就可以完美解決了。

雖然緩存非常好用,但是使用緩存的過程中,我們要關(guān)注緩沖的命中率,命中率=返回正確結(jié)果數(shù)/請(qǐng)求緩存次數(shù),命中率是衡量緩存有效性的重要指標(biāo),命中率越高,說(shuō)明緩存的使用率越高。

除了要關(guān)注緩存命中率,我們還要了解緩存的清空策略,比如 先進(jìn)先出策略FIFO(first in first out)、最少使用策略LFU(less frequently used) 和最近最少使用策略LRU(least recently used)。

如何提高緩存命中率

剛才我們也說(shuō)了,命中率是衡量緩存有效性的重要指標(biāo),那么怎么才能提高緩存命中率呢?

其實(shí)要想提高緩存命中率,需要考慮的點(diǎn)有很多,大概有以下幾點(diǎn):

1.選擇合適的業(yè)務(wù)場(chǎng)景

首先,緩存適合讀多寫少的場(chǎng)景,最好還是高頻訪問的場(chǎng)景,因?yàn)樵L問頻率越高,命中率也就越高。

2.合理設(shè)置緩存容量

緩存容量如果太小的話,會(huì)觸發(fā)Redis的內(nèi)存淘汰機(jī)制,這樣就會(huì)導(dǎo)致一些緩存key被刪除,就會(huì)降低緩存命中率,所以,合理設(shè)置緩存容量是非常有必要的。

3.控制好緩存粒度

緩存的粒度越小,緩存命中率越高,因?yàn)閱蝹€(gè)key的數(shù)據(jù)單位越小的話,這個(gè)緩存就越不容易發(fā)生更改。

4.靈活設(shè)置緩存key的過期時(shí)間

這里說(shuō)的是,要盡量避免緩存同時(shí)過期,如果緩存同時(shí)過期的話,假如此時(shí)有多個(gè)查詢請(qǐng)求,那么這些請(qǐng)求就都會(huì)打到數(shù)據(jù)庫(kù)上去。這種情況叫做緩存擊穿,這會(huì)導(dǎo)致數(shù)據(jù)庫(kù)的壓力很大。

5.避免緩存穿透

先來(lái)了解下緩存命中率,比如當(dāng)請(qǐng)求過來(lái)查詢一條數(shù)據(jù)時(shí),如果在緩存中沒有查到這條數(shù)據(jù),此時(shí),我們可以說(shuō)沒有命中緩存,如果大量查詢請(qǐng)求在緩存中都很少能查到數(shù)據(jù),我們就可以說(shuō)緩存命中率很低。

當(dāng)緩存命中率很低時(shí),因?yàn)樵诰彺嬷胁椴坏綌?shù)據(jù),這個(gè)時(shí)候請(qǐng)求就會(huì)打到數(shù)據(jù)中,去數(shù)據(jù)庫(kù)中查詢數(shù)據(jù),如果數(shù)據(jù)庫(kù)中依然沒有查到數(shù)據(jù),說(shuō)明這個(gè)請(qǐng)求已經(jīng)穿透緩存了。

一旦緩存穿透了,當(dāng)海量的請(qǐng)求涌來(lái)時(shí),如果一直命中不了緩存,海量的請(qǐng)求就會(huì)轉(zhuǎn)而涌向數(shù)據(jù)庫(kù),而數(shù)據(jù)庫(kù)處理請(qǐng)求的能力是有限的,此時(shí)數(shù)據(jù)庫(kù)可能因?yàn)檎?qǐng)求量暴增壓力過大而宕機(jī),數(shù)據(jù)庫(kù)一旦宕機(jī),就很有可能演化成緩存雪崩,導(dǎo)致整個(gè)系統(tǒng)大面積的陷入癱瘓,這是非常恐怖的。

所以,我們需要提前做好兜底方案,以此來(lái)避免緩存穿透的發(fā)生,比如當(dāng)一個(gè)查詢請(qǐng)求過來(lái)時(shí),如果緩存中沒有查詢到數(shù)據(jù),數(shù)據(jù)庫(kù)中也還是沒有查詢到數(shù)據(jù),此時(shí),我們可以在緩存中,給這個(gè)查詢請(qǐng)求設(shè)置一個(gè)空對(duì)象,然后請(qǐng)求拿著這個(gè)空對(duì)象返回。

同樣的查詢請(qǐng)求下一次再過來(lái)時(shí),直接就可以在緩存中命中這個(gè)空對(duì)象了,請(qǐng)求就不需要涌向數(shù)據(jù)庫(kù)了,這樣就算海量請(qǐng)求涌來(lái)時(shí),也可以做到緩存命中率很高,緩存穿透的問題也就解決了。

6.做好緩存預(yù)熱

一般來(lái)說(shuō),第一次查詢的請(qǐng)求都會(huì)打到數(shù)據(jù)庫(kù)上去,所以,我們可以提前將數(shù)據(jù)庫(kù)的數(shù)據(jù)加載到緩存中,也就是緩存預(yù)熱,這樣的話第一次查詢請(qǐng)求也可以直接走緩存了。

以上幾點(diǎn)都做好的話,那么緩存命中率自然就提高了,好了,接下來(lái)廢話也不多說(shuō)了,我們一起來(lái)搞一把緩存實(shí)戰(zhàn),來(lái)切身感受下加了緩存后的查詢效果。

緩存實(shí)戰(zhàn)

場(chǎng)景介紹:歷史訂單查詢

由于已完成的訂單狀態(tài)不會(huì)再發(fā)生變化,因此再進(jìn)行歷史訂單查詢時(shí)會(huì)將查詢結(jié)果緩存進(jìn)redis,并設(shè)置失效時(shí)間為一小時(shí),因此在緩存失效前,用戶再次查詢歷史訂單時(shí)則會(huì)直接請(qǐng)求redis,減小數(shù)據(jù)庫(kù)壓力

未添加緩存的查詢時(shí)間

Redis優(yōu)化思路

查詢歷史訂單時(shí)會(huì)先查詢r(jià)edis中是否有緩存,如有則直接返回redis中數(shù)據(jù),如無(wú)則會(huì)查詢MySQL,然后將查詢數(shù)據(jù)返回,同時(shí)將查詢結(jié)果設(shè)置到緩存中,以便下一次查詢可以走緩存。

緩存Key的生成規(guī)則

用戶id+頁(yè)碼+頁(yè)數(shù)生成redis Key

緩存核心代碼

緩存優(yōu)化后的效果

加緩存后可以看到第二次請(qǐng)求時(shí)走了redis緩存查詢,效率有了極大的提升。

然后,你加了緩存之后,發(fā)現(xiàn)效果確實(shí)不錯(cuò),大量請(qǐng)求打到了緩存上,數(shù)據(jù)庫(kù)的資源占用率也維持在一個(gè)合理的范圍,sql查詢時(shí)間也都穩(wěn)定在了300ms以下。

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2017-04-12 23:50:41

MQ流量緩沖

2023-12-04 13:50:00

程序高并發(fā)

2024-11-04 08:02:23

SpringRabbitMQ中間件

2024-10-08 10:10:00

削峰高并發(fā)流量

2016-09-13 19:51:01

移動(dòng)應(yīng)用圖片流量?jī)?yōu)化

2021-08-05 15:04:14

消息隊(duì)列后端

2018-10-19 12:47:35

MySQLSQL優(yōu)化數(shù)據(jù)庫(kù)

2010-09-26 13:40:14

SQL查詢

2009-08-05 10:08:55

MySQL查詢優(yōu)化調(diào)度鎖定

2020-07-13 07:10:09

SQLSQL語(yǔ)句查詢

2019-09-11 10:40:49

MySQL大分頁(yè)查詢數(shù)據(jù)庫(kù)

2023-03-13 00:01:10

數(shù)據(jù)庫(kù)性能MySQL

2016-12-15 09:58:26

優(yōu)化SQL高性能

2017-07-12 13:04:23

數(shù)據(jù)庫(kù)SQL查詢執(zhí)行計(jì)劃

2010-06-12 15:31:04

MySQL查詢優(yōu)化

2010-04-19 17:09:30

Oracle sql

2012-11-29 09:56:37

流量控制器過濾器Linux TC

2010-10-14 15:59:30

MySQL查詢緩存變量

2009-04-20 08:51:50

MySQL查詢優(yōu)化數(shù)據(jù)庫(kù)

2024-10-29 09:40:07

流量技術(shù)架構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)