成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分庫分表實戰:激流勇進-千萬級數據優化之加緩存

數據庫 其他數據庫
過前面索引和sql的優化后,現在查詢速度快的飛起,然后,我們繼續回歸到了日常需求的開發中。

前 言

經過前面索引和sql的優化后,現在查詢速度快的飛起,然后,我們繼續回歸到了日常需求的開發中。

3個月過后,訂單表的數據已經達到5000萬了,不過sql一次查詢的時間,基本穩定在300ms以下。

但是某個周一,leader剛開完周會就直接來找你了,直接說:“哎呀,周會上DBA找我了,說咱們訂單組的sql偶爾會超過2s,DBA現在要求優化,平均時間要優化到300ms以下,不過,優化前你要先查下,為什么sql的查詢時間會偶爾突增。”

問題排查

然后我們就接下了這個任務,接著,我們就根據DBA給的慢sql,去查這條sql的相關日志,然后結合著監控,最后發現這條sql平常一直很穩定,但是在高峰期的時候,這條sql偶爾花費的時間會超過2s。

此時,我們又查看了一下訂單數據庫所在物理機的資源占用情況,發現高峰期時,這臺物理機的資源占用非常高,CPU和內存占用率都很高,這下基本就確定原因了。

說白了,就是一到高峰期,大量請求跑到MySQL這查詢數據,此時就會有大量請求密集請求數據庫,然后就會導致數據庫所在機器的CPU和內存占用率都飆升,最終就會導致MySQL查詢效率極速降低。

leader了解情況后說:“其實數據庫查詢慢,不一定就是MySQL數據量大導致的,比如當前這個情況,明顯是大量請求密集請求數據庫,造成數據庫負載變大,從而大大降低了數據庫的查詢效率,這個時候,其實我們就需要在MySQL的前邊,加上一層緩存,來進行流量削峰,以保證MySQL能穩定的完成查詢”

經過leader一點撥,我們恍然大悟,原來是這樣,說白了,這個時候我們可以加一些緩存,來為MySQL進行流量削峰,添加了緩存后的運行流程,大概是這樣的:

就是說,按照標準的請求流程,用戶的請求是會打到數據庫上的,但是加了緩存之后就不是這種流程了。這個時候請求可以直接從緩存中獲取到數據并返回,此時就會減少后續流程的處理,比如查詢數據庫的操作,這樣就有效降低了數據庫的負載。

說白了,就是使用緩存來承接大多數的查詢請求,達到流量削峰的效果,從而降低數據庫的負載,以保證MySQL能穩定高效的完成查詢,這樣MySQL在高峰期查詢時間突增的問題就可以完美解決了。

雖然緩存非常好用,但是使用緩存的過程中,我們要關注緩沖的命中率,命中率=返回正確結果數/請求緩存次數,命中率是衡量緩存有效性的重要指標,命中率越高,說明緩存的使用率越高。

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

如何提高緩存命中率

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

其實要想提高緩存命中率,需要考慮的點有很多,大概有以下幾點:

1.選擇合適的業務場景

首先,緩存適合讀多寫少的場景,最好還是高頻訪問的場景,因為訪問頻率越高,命中率也就越高。

2.合理設置緩存容量

緩存容量如果太小的話,會觸發Redis的內存淘汰機制,這樣就會導致一些緩存key被刪除,就會降低緩存命中率,所以,合理設置緩存容量是非常有必要的。

3.控制好緩存粒度

緩存的粒度越小,緩存命中率越高,因為單個key的數據單位越小的話,這個緩存就越不容易發生更改。

4.靈活設置緩存key的過期時間

這里說的是,要盡量避免緩存同時過期,如果緩存同時過期的話,假如此時有多個查詢請求,那么這些請求就都會打到數據庫上去。這種情況叫做緩存擊穿,這會導致數據庫的壓力很大。

5.避免緩存穿透

先來了解下緩存命中率,比如當請求過來查詢一條數據時,如果在緩存中沒有查到這條數據,此時,我們可以說沒有命中緩存,如果大量查詢請求在緩存中都很少能查到數據,我們就可以說緩存命中率很低。

當緩存命中率很低時,因為在緩存中查不到數據,這個時候請求就會打到數據中,去數據庫中查詢數據,如果數據庫中依然沒有查到數據,說明這個請求已經穿透緩存了。

一旦緩存穿透了,當海量的請求涌來時,如果一直命中不了緩存,海量的請求就會轉而涌向數據庫,而數據庫處理請求的能力是有限的,此時數據庫可能因為請求量暴增壓力過大而宕機,數據庫一旦宕機,就很有可能演化成緩存雪崩,導致整個系統大面積的陷入癱瘓,這是非常恐怖的。

所以,我們需要提前做好兜底方案,以此來避免緩存穿透的發生,比如當一個查詢請求過來時,如果緩存中沒有查詢到數據,數據庫中也還是沒有查詢到數據,此時,我們可以在緩存中,給這個查詢請求設置一個空對象,然后請求拿著這個空對象返回。

同樣的查詢請求下一次再過來時,直接就可以在緩存中命中這個空對象了,請求就不需要涌向數據庫了,這樣就算海量請求涌來時,也可以做到緩存命中率很高,緩存穿透的問題也就解決了。

6.做好緩存預熱

一般來說,第一次查詢的請求都會打到數據庫上去,所以,我們可以提前將數據庫的數據加載到緩存中,也就是緩存預熱,這樣的話第一次查詢請求也可以直接走緩存了。

以上幾點都做好的話,那么緩存命中率自然就提高了,好了,接下來廢話也不多說了,我們一起來搞一把緩存實戰,來切身感受下加了緩存后的查詢效果。

緩存實戰

場景介紹:歷史訂單查詢

由于已完成的訂單狀態不會再發生變化,因此再進行歷史訂單查詢時會將查詢結果緩存進redis,并設置失效時間為一小時,因此在緩存失效前,用戶再次查詢歷史訂單時則會直接請求redis,減小數據庫壓力

未添加緩存的查詢時間

Redis優化思路

查詢歷史訂單時會先查詢redis中是否有緩存,如有則直接返回redis中數據,如無則會查詢MySQL,然后將查詢數據返回,同時將查詢結果設置到緩存中,以便下一次查詢可以走緩存。

緩存Key的生成規則

用戶id+頁碼+頁數生成redis Key

緩存核心代碼

緩存優化后的效果

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

然后,你加了緩存之后,發現效果確實不錯,大量請求打到了緩存上,數據庫的資源占用率也維持在一個合理的范圍,sql查詢時間也都穩定在了300ms以下。


責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2022-07-04 23:24:28

sql優化監控

2022-01-28 08:59:59

分庫分表數據

2022-07-08 08:57:36

數據優化垂直拆分數據庫

2022-07-07 09:33:06

MySQL查詢數據優化

2022-01-27 08:14:54

數據優化讀寫分離

2022-07-05 21:31:21

索引SQL分庫分表

2022-09-26 08:28:22

分庫分表數據

2022-10-10 17:37:59

分庫分表訂單業務

2021-09-08 09:48:39

數據庫工具技術

2015-08-25 10:38:20

中企通信云數據中心

2024-12-26 08:37:39

2022-10-13 17:43:10

MySQL存放數據

2018-07-11 20:07:06

數據庫MySQL索引優化

2020-07-30 17:59:34

分庫分表SQL數據庫

2022-06-30 07:34:46

分庫分表外賣訂單系統

2021-07-28 15:44:52

Java開發數據庫

2019-11-12 09:54:20

分庫分表數據

2019-01-16 14:00:54

數據庫分庫分表

2024-08-02 15:47:28

數據庫分庫分表

2023-11-01 10:37:47

IT領導者CIO
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产三级大片 | 国产精品视频久久 | 神马久久久久久久久久 | 亚洲电影一区 | 欧美三级电影在线播放 | 国产四虎 | 日本一区二区三区四区 | 日韩无 | 色综网| 正在播放国产精品 | 天堂亚洲网 | 国产一级在线视频 | 91大片| 蜜桃精品视频在线 | 日日噜噜噜夜夜爽爽狠狠视频97 | 国产黄色av电影 | 欧美国产精品一区二区三区 | av网站在线看| 一区二区不卡 | 日韩成人在线一区 | 国产免费一区二区三区免费视频 | 自拍中文字幕 | 国产精品久久毛片av大全日韩 | 国内精品久久久久久久影视简单 | 亚洲va国产日韩欧美精品色婷婷 | 在线欧美 | 日韩欧美在线视频 | 亚洲永久精品国产 | 91精品久久久久久久久中文字幕 | 欧美在线观看一区 | 天天干天天爱天天爽 | 欧美在线观看一区 | 欧美激情视频一区二区三区免费 | av入口| 欧日韩在线 | 免费看黄色小视频 | 亚洲精品乱码8久久久久久日本 | 日韩精品在线免费观看 | 日韩成人免费中文字幕 | 日本一二区视频 | 一区二区小视频 |