第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

其實(shí)真是的秒殺不是這樣的

作為java的多年經(jīng)驗(yàn)的碼農(nóng)覺得老師的東西很怪異,CAS原理都不講的,你用mysql的鎖去應(yīng)對(duì)秒殺基本就死在哪里了。

1、老師說(shuō)得這個(gè)行鎖很怪異,mysql根本就沒(méi)有這個(gè)東西,沒(méi)有加for update你會(huì)有行鎖嗎?不知道老師所謂的行鎖是從天而降嗎??這個(gè)稱為悲觀鎖。但是代價(jià)太大,我們基本不用。因?yàn)槭褂盟?,你所有的線程就等著掛起和等待了,系統(tǒng)就基本就死在哪里了。

2、一般我們即時(shí)使用數(shù)據(jù)庫(kù),也不會(huì)這樣用,應(yīng)該加一個(gè)version字段。

(1)首先是程序讀取select? version, left from table;

(2)然后記錄version字段(舊值),判定left - buyCount(購(gòu)買數(shù)量)>=0,如果否退出,結(jié)束業(yè)務(wù)。否則繼續(xù)(3)

(3)開始執(zhí)行減庫(kù)存

update table set left = left - #{byCount} , version =? version+1

where count >0 and vesion = #{vesion}//這個(gè)version是舊值,而更新一次成功version就加1

這里數(shù)據(jù)庫(kù)并沒(méi)有任何鎖,但是這里巧妙的使用了version字段,符合一個(gè)CAS原理,就是我當(dāng)初讀出的version(舊值)和實(shí)時(shí)數(shù)據(jù)庫(kù)的version(當(dāng)前需要更新時(shí)刻的實(shí)時(shí)值)是否一致,如果一致,則我會(huì)認(rèn)為這條記錄沒(méi)有被其他線程修改,則減庫(kù)存成功,如果不一致則我會(huì)認(rèn)為其他線程修改過(guò)這個(gè)記錄。就不會(huì)進(jìn)行操作這個(gè)被稱為樂(lè)觀鎖。這個(gè)時(shí)候我們會(huì)考慮重入,重復(fù)執(zhí)行(1)-(3)步驟直至(2)的退出或者(3)成功繼續(xù)我們的操作,這樣就是一個(gè)沒(méi)有鎖的機(jī)制。這就是一個(gè)樂(lè)觀鎖的機(jī)制,而沒(méi)有任何等待的機(jī)制,是一個(gè)非阻塞的過(guò)程。


3、企業(yè)的秒殺目前應(yīng)該考慮使用redis,而不是mysql。

別和我說(shuō)你mysql的性能和redis比,個(gè)人自測(cè)分別批量插入數(shù)據(jù):

redis每秒在我的機(jī)子可以執(zhí)行40萬(wàn)次的插入,而mysql只能執(zhí)行不到2萬(wàn)次。這個(gè)性能差了幾十倍。你用mysql是自己找麻煩。這個(gè)級(jí)別根本不同級(jí),其次redis提供的事務(wù)很好的符合了秒殺的功能。

首先任何線程執(zhí)行redis的操作的時(shí)候都是使用lua語(yǔ)言,redis在執(zhí)行l(wèi)ua語(yǔ)言的時(shí)候是原子性的,讓它執(zhí)行減庫(kù)存,并且記錄用戶購(gòu)買記錄。

直至秒殺時(shí)間到期或者庫(kù)存為0,才考慮將redis緩存的數(shù)據(jù)批量一次性把減庫(kù)存和用戶購(gòu)買的信息批量寫入mysql。整個(gè)秒殺過(guò)程基本在redis完成,而不是數(shù)據(jù)庫(kù),不是你mysql的性能可比的,你服務(wù)器上mysql一秒可以4萬(wàn)次,redis可以上百萬(wàn)次,你怎么比??

正在回答

5 回答

秒殺場(chǎng)景主要兩個(gè)點(diǎn):

1:流控系統(tǒng),防止后端過(guò)載或不必要流量進(jìn)入,因?yàn)槟秸n要求課程的長(zhǎng)度和簡(jiǎn)單性,沒(méi)有加。

2:減庫(kù)存競(jìng)爭(zhēng),減庫(kù)存的update必然涉及exclusive lock ,持有鎖的時(shí)間越短,并發(fā)性越高。

CAS是否適用瞬時(shí)競(jìng)爭(zhēng)?

1:"select? version, left from table where pk= {pid}"不加 for update 并發(fā)得到共享version

2: "update table set left = left - #{byCount} , version =? version+1?where pk={id} count >0 and vesion = #{vesion}" 首先這句sql本身會(huì)加row-level exclusive?lock。version大量沖突導(dǎo)致減庫(kù)存失效,客戶端重試導(dǎo)致TPS翻倍,加重DB負(fù)擔(dān)。

3:對(duì)于使用redis+LUA實(shí)現(xiàn)秒殺庫(kù)存邏輯,重點(diǎn)在異步MQ落地可靠性和異常回滾機(jī)制。

對(duì)于生產(chǎn)環(huán)境的秒殺沒(méi)有這么簡(jiǎn)單,需要全鏈路梳理和優(yōu)化,參見之前同事的分享:http://www.infoq.com/cn/presentations/challenge-of-alipay-red-envelopes

最后,不用回我了,如果你覺得我講的問(wèn)題多,希望你也錄一個(gè)課程,這樣可以幫助大家,何樂(lè)不為呢。

3 回復(fù) 有任何疑惑可以回復(fù)我~

首先感謝你的回復(fù),這門課已經(jīng)說(shuō)了,用最常用的技術(shù)分析實(shí)現(xiàn)秒殺場(chǎng)景。

其次你的思路請(qǐng)?jiān)谙胂搿⒖家幌挛臋n:

http://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html

http://www.infoq.com/cn/presentations/seckill-solution-based-sql

http://geek.csdn.net/news/detail/93986

作者之前就在阿里淘寶技術(shù)部,秒殺處理方式我還是比較清楚的。

最后這門課只是幫助有需要的同學(xué)。

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

楊開振 提問(wèn)者

問(wèn)題是這樣會(huì)誤導(dǎo)學(xué)生,做教育的應(yīng)該有責(zé)任心,企業(yè)面試會(huì)允許你加數(shù)據(jù)庫(kù)的一個(gè)鎖嗎??不會(huì)CAS原理,人家就認(rèn)為你都不會(huì)的了,這是一個(gè)最基本的東西,對(duì)吧。這樣會(huì)導(dǎo)致人家面試會(huì)被刷掉的。
2016-10-31 回復(fù) 有任何疑惑可以回復(fù)我~
#2

慕粉3820626 回復(fù) 楊開振 提問(wèn)者

update語(yǔ)句執(zhí)行之后就會(huì)獲得排它鎖了。。。。老師的這種方法 在不是超大規(guī)模的并發(fā)都很實(shí)用 視頻里面已經(jīng)說(shuō)了啊 用redis加rabbitMQ實(shí)現(xiàn)浪費(fèi)人力物力,如果沒(méi)有特別大的并發(fā) 沒(méi)必要用那些東西
2017-12-18 回復(fù) 有任何疑惑可以回復(fù)我~

mysql的默認(rèn)RR級(jí)別,對(duì)于寫寫操作,不是默認(rèn)加行鎖嗎?這個(gè)人問(wèn)了一大段的結(jié)果問(wèn)題就是錯(cuò)的

0 回復(fù) 有任何疑惑可以回復(fù)我~

mysql執(zhí)行update語(yǔ)句的時(shí)候已經(jīng)獲得了這條記錄的排它鎖了 也就是老師說(shuō)的行級(jí)鎖吧

0 回復(fù) 有任何疑惑可以回復(fù)我~

楊開振你這妖孽寫完書來(lái)這兒砸場(chǎng)子

0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

楊開振 提問(wèn)者

多探討,多點(diǎn)了解而已,有質(zhì)疑是好事
2016-11-15 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消

其實(shí)真是的秒殺不是這樣的

我要回答 關(guān)注問(wèn)題
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)