-
make (安裝 redis)
查看全部 -
優(yōu)化總結(jié)。
查看全部 -
優(yōu)化Update更新庫存(2)
查看全部 -
優(yōu)化Update更新庫存(1)
查看全部 -
高并發(fā)優(yōu)化常用方案
成本:
1)運(yùn)維成本和穩(wěn)定性:NoSQL,MQ等
2)開發(fā)成本:數(shù)據(jù)一致性,回滾方案等
3)冪等性難保證:重復(fù)秒殺問題
4)不適合新手的架構(gòu)
查看全部 -
秒殺操作優(yōu)化分析:后端緩存困難(庫存問題)
查看全部 -
秒殺地址接口分析:因?yàn)橐恢滦跃S護(hù)成本低,所以適合服務(wù)端緩存
查看全部 -
CDN的理解
查看全部 -
詳情頁部署到CDN
查看全部 -
redis緩存工具的使用,以及配置
查看全部 -
CDN特點(diǎn):CDN是和請(qǐng)求對(duì)應(yīng)的資源是不變化的,比如靜態(tài)資源和JavaScript(URL對(duì)應(yīng)的結(jié)果不變)
CDN是什么:
? ? ?1:CDN是(內(nèi)容分發(fā)網(wǎng)絡(luò))加速用戶獲取數(shù)據(jù)的系統(tǒng),例如視頻資源
? ? ?2:部署在離用戶最近的網(wǎng)絡(luò)節(jié)點(diǎn)上 3:命中CDN不需要訪問后端服務(wù)器
? ? ?4:互聯(lián)網(wǎng)公司自己搭建或租用CDN
使用CDN的好處:
? ? ?01 不用去官網(wǎng)直接下載 02 當(dāng)我們的服務(wù)上線一些穩(wěn)定可靠的CDN比直接發(fā)布到我們的服務(wù)器更有效
? ? ?03 CDN也是web最重要的一個(gè)加速的功能點(diǎn) 怎樣讓系統(tǒng)抗住很高的并發(fā)的時(shí)候CDN也是一個(gè)點(diǎn)
高并發(fā)出現(xiàn)的點(diǎn):
1.獲取系統(tǒng)時(shí)間(但是不用優(yōu)化,訪問一次內(nèi)存(Cacheline)大約10ns)
2.秒殺地址接口分析:
? ?1.無法使用CDN緩存
? ?2.但是它適合放在服務(wù)器緩存:Redis等->內(nèi)存的服務(wù)器端的緩存可以抗很高的QPS,10^5/sQPS,
? ? ?現(xiàn)在Redis可以做集群,做了之后QPS可以達(dá)到10^6/s。
? ?3.為什么要做后端緩存 -> 因?yàn)楹蠖司彺婵梢杂梦覀兊臉I(yè)務(wù)系統(tǒng)來控制。
? ? ?比如先訪問數(shù)據(jù)庫拿到秒殺的數(shù)據(jù)放到Redis緩存里面去,當(dāng)一次訪問的時(shí)候直接去緩存里面查找,
? ? ?緩存有就直接返回,而不去訪問我們數(shù)據(jù)庫了。
? ?4.一致性維護(hù)成本比較低:當(dāng)我們秒殺的東西或秒殺的對(duì)象改變了的時(shí)候,
? ? ?我們可以修改我們的數(shù)據(jù)庫,同時(shí)在改一下我們的緩存,或者干脆不改,等超時(shí)之后在改
秒殺地址接口優(yōu)化:請(qǐng)求地址 -> Redis[一致性維護(hù)(超時(shí)穿透到SQL語句/當(dāng)SQL語句更新時(shí)主動(dòng)更新)] -> SQL語句
3.秒殺操作優(yōu)化分析(是最重要的一個(gè)秒殺按鈕操作):
? ?1.也是不能使用CDN緩存的,CDN不可能把你最核心的東西給緩存(大部分寫操作或最核心的數(shù)據(jù)請(qǐng)求一般沒辦法使用CDN)
? ?2.后端緩存困難:庫存的問題,不可能在緩存里面減庫存,否則會(huì)產(chǎn)生數(shù)據(jù)不一致問題。所以要通過事務(wù)來保證數(shù)據(jù)的一致性
? ?3.一行數(shù)據(jù)競(jìng)爭:熱點(diǎn)商品,會(huì)對(duì)數(shù)據(jù)庫表中的那一行數(shù)據(jù)產(chǎn)生大量的update減庫存競(jìng)爭
1:瓶頸分析:
update 減庫存:客戶端會(huì)執(zhí)行update,根據(jù)拿到結(jié)果是否更新了,當(dāng)我們的SQL通過網(wǎng)絡(luò)發(fā)送給數(shù)據(jù)庫時(shí)本身就有網(wǎng)絡(luò)延遲,
? ? ? ? ? ? ? 除了網(wǎng)絡(luò)延遲還有java GC(garbage collection,垃圾回收)操作 -> 不需要手動(dòng)去回收,
? ? ? ? ? ? ? GC自動(dòng)就幫我們回收了,新生代GC會(huì)暫停所有的事務(wù)代碼(Java代碼)后,執(zhí)行GC(一般在幾十ms),
? ? ? ? ? ? ? 并且,同一行事務(wù)是做串行化的。
---->insert 購買明細(xì):也會(huì)存在網(wǎng)絡(luò)延遲和GC
---->commit/rollback
也就是說如果是Java客戶端去控制這些事務(wù)會(huì)有什么問題:update 減庫存(網(wǎng)絡(luò)延遲,可能的GC,GC不一定每次都出現(xiàn),但一定會(huì)出現(xiàn))
--> 執(zhí)行insert 購買明細(xì)(在網(wǎng)絡(luò)延遲等待insert語句的返回,然后也可能會(huì)GC) --> 最后commit/rollback。
當(dāng)前面的這些操作都執(zhí)行完之后,第二個(gè)等待行鎖的線程菜能夠有機(jī)會(huì)拿到這一行的鎖在去執(zhí)行update減庫存
特點(diǎn):
? ?根據(jù)上面的拆分,所以QPS很好分析了 --->(我們所有的SQL執(zhí)行時(shí)間 + 網(wǎng)絡(luò)延遲時(shí)間 + 可能的GC)
? ?這一行數(shù)據(jù)就是當(dāng)前可以執(zhí)行的時(shí)間.比如時(shí)間是2ms,概念是1s之內(nèi)只能有500次減庫存的秒殺操作,但是對(duì)于
? ?秒殺系統(tǒng),特別是熱點(diǎn)系統(tǒng)來說其實(shí)是不能滿足我們的要求的,特別是排隊(duì)特別長的時(shí)候,性能會(huì)呈現(xiàn)指數(shù)級(jí)別下降
得到的點(diǎn)是:行級(jí)鎖是在commit/rollback之后釋放的;
優(yōu)化方向:怎樣減少行級(jí)鎖持有的時(shí)間 ---> (當(dāng)你update表中一行數(shù)據(jù)的時(shí)候,一定要快速的commit/rollback,
? ? ? ? ?因?yàn)槠渌€在等待,因?yàn)檫@是一個(gè)熱點(diǎn)的數(shù)據(jù));
2:延遲分析:
延遲問題是很關(guān)鍵的;
優(yōu)化思路:
-把客戶端邏輯放到MySQL(數(shù)據(jù)庫)服務(wù)端,避免網(wǎng)絡(luò)延遲和GC影響
-如何放到MySQL服務(wù)端:
--兩種解決方案:
---定制SQL方案: 早期的阿里巴巴的天貓做了一個(gè)MySQL的源碼層的修改 --->update/*+[auto_commit]*/,
? ?但是執(zhí)行完這句update之后,會(huì)自動(dòng)進(jìn)行回滾(條件是:當(dāng)update影響的記錄數(shù)是1,它就會(huì)commit,如果等于0就會(huì)rollback)
? ?也就是說它不給Java客戶端和MySQL之間網(wǎng)絡(luò)延遲,然后在由Java客戶端去控制commit還是rollback,而是直接用這條語句直接發(fā)過去
? ?告訴它是commit還是rollback。本質(zhì)上也是降低了網(wǎng)絡(luò)延遲和GC的干擾,但是成本很高 --> 需要修改MySQL源碼,大公司可以這樣的團(tuán)隊(duì)
--使用存儲(chǔ)過程: 整個(gè)事務(wù)在MySQL端完成;存儲(chǔ)過程設(shè)計(jì)出來的本質(zhì)就是想讓我們的一組SQL組成一個(gè)事務(wù),然后在服務(wù)器端完成,
? 而避免客戶端去完成事務(wù)造成的一個(gè)性能的干擾。一般情況下像是spring聲明式事務(wù)或我們手動(dòng)控制事務(wù)都是客戶端控制事務(wù),
? 這個(gè)事務(wù)在行級(jí)鎖沒有那么高的競(jìng)爭情況下是完全OK的,但秒殺是一個(gè)特殊的應(yīng)用場(chǎng)景,它會(huì)在同一行中產(chǎn)生熱點(diǎn),大家都競(jìng)爭同一行父,
? 那么這個(gè)時(shí)候存儲(chǔ)過程就發(fā)揮作用了,它把整個(gè)這條SQL執(zhí)行過程完全放在MySQL中完成了,
? MySQL執(zhí)行的效率非常高,因?yàn)槲覀兌际峭ㄟ^主鍵去執(zhí)行的,查詢或更新
優(yōu)化總結(jié):
1:前端控制:暴露接口,按鈕防重復(fù)
2:動(dòng)靜態(tài)數(shù)據(jù)分離:CDN緩存,后端緩存
3:事務(wù)競(jìng)爭優(yōu)化:減少事務(wù)鎖時(shí)間 ---> 這是秒殺用MySQL解決秒殺問題的很重要的一個(gè)關(guān)鍵點(diǎn);
? ?因?yàn)橛檬聞?wù)有一個(gè)很大的優(yōu)點(diǎn)是:保證原子性、隔離性、一致性、持久性。查看全部 -
原子技術(shù)-存儲(chǔ)到redis等nosql數(shù)據(jù)庫
-記錄行為信息-通過消息隊(duì)列MQ
-消息接收落地-處理mysql
查看全部 -
并發(fā)優(yōu)化!
查看全部 -
【W(wǎng)EB層技術(shù)回顧】
restful接口:用來描述資源,通過不同的提交方式(GET/POST)來達(dá)到描述行為的目的;
寫一般通過post,讀一般通過get。
查看全部 -
【業(yè)務(wù)層技術(shù)回顧】
站在使用者角度設(shè)計(jì)接口,而不是考慮怎么去實(shí)現(xiàn)這個(gè)接口,達(dá)到干凈直接的目的;
SpringIOC配置,XML配置,注解,包掃描。
查看全部
舉報(bào)