后端資源常見(jiàn)的使用優(yōu)化
隨著服務(wù)端流量的不斷遞增,對(duì)底層資源的依賴(lài)也越來(lái)越重,連接數(shù)增多,IO負(fù)載高等,很多性能瓶頸由此產(chǎn)生。下面結(jié)合自身經(jīng)驗(yàn),主要談?wù)凞B/Redis/Mc的優(yōu)化。
DB
DB的查詢(xún)會(huì)觸發(fā)磁盤(pán)IO,我們知道IO的代價(jià)是很高的,所以DB的優(yōu)化主要從降低IO次數(shù)著手。
a. 優(yōu)化慢查詢(xún)
優(yōu)化慢查詢(xún)主要考慮從索引入手,眾所周知,Innodb索引存儲(chǔ)結(jié)構(gòu)為B+樹(shù),真正的數(shù)據(jù)項(xiàng)只存在于葉子節(jié)點(diǎn),所以要考慮降低樹(shù)的查詢(xún)長(zhǎng)度,例如:有一表的列字段如下
`card`?varchar(10)?DEFAULT?NULL,UNIQUE?KEY?`idx_card`?(`card`),
explain?SELECT?*?FROM?`table`?WHERE?`card`?=?187300;
由于SQL的隱式轉(zhuǎn)換(關(guān)于隱式轉(zhuǎn)換,推薦閱讀Type Conversion in Expression Evaluation),這個(gè)查詢(xún)并沒(méi)有辦法命中索引。需要類(lèi)型進(jìn)行對(duì)應(yīng),正確寫(xiě)法:
explain?SELECT?*?FROM?`table`?WHERE?`card`?=?'187300';
在比如COUNT,SUM,LIKE,等列運(yùn)算,應(yīng)盡量避免,具體結(jié)合對(duì)應(yīng)的業(yè)務(wù)場(chǎng)景。比如:COUNT通過(guò)計(jì)數(shù)器緩存,LIKE使用最左匹配等。
b.分庫(kù)分表
數(shù)據(jù)庫(kù)的劃分,可以按具體業(yè)務(wù)劃分成不同的微服務(wù)庫(kù),這樣方便單體資源的監(jiān)控、擴(kuò)容。例如:媒資庫(kù)、用戶(hù)庫(kù)等等。
分表邏輯可以從兩個(gè)維度考慮。一方面是水平分割,例如:常見(jiàn)Feed查詢(xún)場(chǎng)景,我關(guān)注的一批(多個(gè)uid)用戶(hù)的某些行為,數(shù)據(jù)表可以按照月或者天水平切分,具體的切分粒度要參考業(yè)務(wù)數(shù)據(jù)量,保證每張表的數(shù)據(jù)量都在百萬(wàn)行即可。
垂直切分的話(huà),也分兩個(gè)方面,一個(gè)是表列的切分,可以劃分為內(nèi)容表,索引表,主表,附屬表等。表數(shù)據(jù)的切分要依據(jù)查詢(xún)場(chǎng)景,例如:針對(duì)用戶(hù)內(nèi)容表的查詢(xún)(主鍵查詢(xún)基本內(nèi)容),將uid取模hash即可。由于垂直切分寫(xiě)入更新時(shí),要同時(shí)處理多張表,所以要考慮數(shù)據(jù)的一致性(原子性)。
Redis
a. 資源類(lèi)型劃分
我們知道Redis內(nèi)部是以單進(jìn)程的模式運(yùn)行的,即每次只能執(zhí)行一個(gè)redis命令,所以很容出現(xiàn)一種情況是,一個(gè)復(fù)雜的操作,例如:hash/set等導(dǎo)致用戶(hù)進(jìn)程卡住,連接沒(méi)有及時(shí)釋放,后續(xù)redis操作無(wú)法及時(shí)響應(yīng)。這種情況,需要把Redis拆分成KV和復(fù)雜操作兩個(gè)資源類(lèi)型,KV時(shí)間復(fù)雜度為O(1),可以用于counter,kv緩存等常見(jiàn)場(chǎng)景,其他操作都放在復(fù)雜操作資源里執(zhí)行。
b. 集群的使用
之所以單獨(dú)說(shuō)一下redis集群,是因?yàn)閞edis3.0之前官方并沒(méi)有支持集群,集群的使用需要通過(guò)一致性Hash算法,但是要考慮到節(jié)點(diǎn)的容災(zāi)與新增節(jié)點(diǎn)后相鄰節(jié)點(diǎn)的數(shù)據(jù)同步,對(duì)業(yè)務(wù)要求比較高。也有開(kāi)源的集群方案,例如:codis,twemproxy、redis cluster等。
MC
memcache常用于緩存臨時(shí)數(shù)據(jù),因?yàn)槭莾?nèi)存kv,所以存儲(chǔ)場(chǎng)景大多是基本content跟list數(shù)據(jù)。
對(duì)MC的優(yōu)化主要集中在業(yè)務(wù)調(diào)用上,例如:DB寫(xiě)入后需要同步寫(xiě)入MC,DB更新后直接更新MC緩存,而不是刪除。
另一方面,由于MC使用基于過(guò)期時(shí)間的LRU的方式淘汰內(nèi)存,應(yīng)該著重評(píng)估過(guò)期時(shí)間的設(shè)置,例如:設(shè)置了很多不過(guò)期(expire time為0)的數(shù)據(jù),當(dāng)逐步把內(nèi)存占滿(mǎn)后,設(shè)置過(guò)期時(shí)間的數(shù)據(jù)將很快失效,這樣會(huì)導(dǎo)致MC命中率非常低。除此之外,資源的配置、key、過(guò)期時(shí)間等應(yīng)該統(tǒng)一管理。
最后,業(yè)務(wù)對(duì)資源的操作也應(yīng)該有統(tǒng)一的出入口,降低資源之間的相互依賴(lài),保證模塊化的資源可用性與可擴(kuò)展性。
推薦閱讀:后端資源常見(jiàn)的使用優(yōu)化
Redis 緩存
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。