日本在线免费视频,国产精品视频2020,亚洲一区二区色,亚洲精品在线播放

淘寶雙11秒殺在哪個(gè)位置 秒懂:淘寶0點(diǎn)0分0秒搶購(gòu)攻略

Hi,大家好,美好的一天從這里開(kāi)始,今天主要講解淘寶雙11秒殺在哪個(gè)位置,淘寶0點(diǎn)0分0秒搶購(gòu)攻略,以及淘寶雙11秒殺的一系列相關(guān)干貨,其實(shí)這篇文章主要還是為新手朋友整理的,總的來(lái)說(shuō)思路還是很重要!

其實(shí)對(duì)于交易平臺(tái)來(lái)說(shuō),面對(duì)的不僅僅是人肉,還有很多腳本,外掛自動(dòng)化的搶購(gòu)系統(tǒng),壓力可想而知。

秒殺的優(yōu)化手段很多,就拿數(shù)據(jù)庫(kù)來(lái)說(shuō),有用排隊(duì)機(jī)制的,有用異步消息的,有用交易合并的。

今天,我要給大家介紹一種更極端的秒殺應(yīng)對(duì)方法,裸秒。

(其實(shí)我很久以前就寫(xiě)過(guò)類似的文章,趁雙十一跟大伙再練練)

目前可能只有PostgreSQL支持裸秒,也即是說(shuō),來(lái)吧,強(qiáng)暴我吧,一起上。 有點(diǎn)淫蕩,但是確實(shí)就是這么暴力。

PostgreSQL提供了一種ad lock,可以讓用戶盡情的釋放激情,以一臺(tái)32核64線程的機(jī)器為例,每秒可以獲取、探測(cè)約130萬(wàn)次的ad lock。

試想一下,對(duì)單條記錄的秒殺操作,達(dá)到了單機(jī)100萬(wàn)/s的處理能力后,秒殺算什么?100臺(tái)機(jī)器就能處理1億/s的秒殺請(qǐng)求,不行我的小心臟受不了了,下面聽(tīng)我娓娓道來(lái)。

秒殺場(chǎng)景簡(jiǎn)介

雖然秒殺已經(jīng)很普遍了,但是出于文章的完整性,還是簡(jiǎn)單介紹一下秒殺的業(yè)務(wù)背景。

例如,Iphone的1元秒殺,如果我只放出1臺(tái)Iphone,我們把它看成一條記錄,秒殺開(kāi)始后,誰(shuí)先搶到(更新這條記錄的鎖),誰(shuí)就算秒殺成功。

對(duì)數(shù)據(jù)庫(kù)來(lái)說(shuō),秒殺瓶頸在于并發(fā)的對(duì)同一條記錄的多次更新請(qǐng)求,只有一個(gè)或者少量請(qǐng)求是成功的,其他請(qǐng)求是以失敗或更新不到記錄而告終。

例如有100臺(tái)IPHONE參與秒殺,并發(fā)來(lái)?yè)尩挠脩粲?00萬(wàn),對(duì)于數(shù)據(jù)庫(kù)來(lái)說(shuō),最小粒度的為行鎖,當(dāng)有一個(gè)用戶在更新這條記錄時(shí),其他的999999個(gè)用戶是在等待中度過(guò)的,以此類推。

除了那100個(gè)幸運(yùn)兒,其他的用戶的等待都是無(wú)謂的,甚至它們不應(yīng)該到數(shù)據(jù)庫(kù)中來(lái)浪費(fèi)資源。

傳統(tǒng)的做法,使用一個(gè)標(biāo)記位來(lái)表示這條記錄是否已經(jīng)被更新,或者記錄更新的次數(shù)(幾臺(tái)Iphone)。

update tbl set xxx=xxx,upd_cnt=upd_cnt+1 where id=pk and upd_cnt+1<=5; — 假設(shè)可以秒殺5臺(tái)

這種方法的弊端:

獲得鎖的用戶在處理這條記錄時(shí),可能成功,也可能失敗,或者可能需要很長(zhǎng)時(shí)間,(例如數(shù)據(jù)庫(kù)響應(yīng)慢)在它結(jié)束事務(wù)前,其他會(huì)話只能等著。

等待是非常不科學(xué)的,因?yàn)閷?duì)于沒(méi)有獲得鎖的用戶,等待是在浪費(fèi)時(shí)間。

常用的秒殺優(yōu)化手段

1. 一般的優(yōu)化處理方法是先使用for update nowait的方式來(lái)避免等待,即如果無(wú)法即可獲得鎖,那么就不等待。

begin;select
1 from tbl where id=pk for update nowait; —
如果用戶無(wú)法即刻獲得鎖,則返回錯(cuò)誤。從而這個(gè)事務(wù)回滾。update tbl set xxx=xxx,upd_cnt=upd_cnt+1
where id=pk and upd_cnt+1<=5;end;

這種方法可以減少用戶的等待時(shí)間,因?yàn)闊o(wú)法即刻獲得鎖后就直接返回了。

2. 合并請(qǐng)求,即將多個(gè)更新合并到一個(gè)更新的請(qǐng)求,這種做法需要修改內(nèi)核,同時(shí)會(huì)破壞ACID,因?yàn)槿绻喜⒑蟮恼?qǐng)求失敗了,會(huì)導(dǎo)致合并中的所有人的請(qǐng)求失敗。(與分組提交不一樣,分組提交是不會(huì)破壞ACID的)。

那么接下來(lái)我們看看AD LOCK。

什么是ad lock

手冊(cè)中的說(shuō)明,AD LOCK是一種面向用戶的輕量級(jí)鎖,鎖的目標(biāo)是一個(gè)整型,分為事務(wù)級(jí)和會(huì)話級(jí)的鎖,以及共享和排他鎖。

在單個(gè)DB內(nèi),只要鎖的整型值不一樣,就可以獲得鎖,如果值一樣,可以使用TRY來(lái)加鎖,沒(méi)有獲得則立即返回FALSE。

https://www.postgresql.org/docs/current/static/functions-admin.html#FUNCTIONS-ADVISORY-LOCKS

Table 9-87. Advisory Lock Functions

Name Return Type Description
pg_advisory_lock(key bigint) void Obtain exclusive session level advisory lock
pg_advisory_lock(key1 int, key2 int) void Obtain exclusive session level advisory lock
pg_advisory_lock_shared(key bigint) void Obtain shared session level advisory lock
pg_advisory_lock_shared(key1 int, key2 int) void Obtain shared session level advisory lock
pg_advisory_unlock(key bigint) boolean Release an exclusive session level advisory lock
pg_advisory_unlock(key1 int, key2 int) boolean Release an exclusive session level advisory lock
pg_advisory_unlock_all() void Release all session level advisory locks held by the current session
pg_advisory_unlock_shared(key bigint) boolean Release a shared session level advisory lock
pg_advisory_unlock_shared(key1 int, key2 int) boolean Release a shared session level advisory lock
pg_advisory_xact_lock(key bigint) void Obtain exclusive transaction level advisory lock
pg_advisory_xact_lock(key1 int, key2 int) void Obtain exclusive transaction level advisory lock
pg_advisory_xact_lock_shared(key bigint) void Obtain shared transaction level advisory lock
pg_advisory_xact_lock_shared(key1 int, key2 int) void Obtain shared transaction level advisory lock
pg_try_advisory_lock(key bigint) boolean Obtain exclusive session level advisory lock if available
pg_try_advisory_lock(key1 int, key2 int) boolean Obtain exclusive session level advisory lock if available
pg_try_advisory_lock_shared(key bigint) boolean Obtain shared session level advisory lock if available
pg_try_advisory_lock_shared(key1 int, key2 int) boolean Obtain shared session level advisory lock if available
pg_try_advisory_xact_lock(key bigint) boolean Obtain exclusive transaction level advisory lock if available
pg_try_advisory_xact_lock(key1 int, key2 int) boolean Obtain exclusive transaction level advisory lock if available
pg_try_advisory_xact_lock_shared(key bigint) boolean Obtain shared transaction level advisory lock if available
pg_try_advisory_xact_lock_shared(key1 int, key2 int) boolean Obtain shared transaction level advisory lock if available

通常數(shù)據(jù)庫(kù)支持的最小粒度的鎖(指開(kāi)放給用戶的)是行鎖,行鎖相比LWLOCK,SPINLOCK等是非常重的,所以傳統(tǒng)的行鎖在秒殺中會(huì)成為非常大的瓶頸,包括鎖的等待。

ad lock的用途

ad lock的用途,除了我接下來(lái)要說(shuō)的秒殺,其實(shí)還有很多用途,例如

并發(fā)的安全性檢查,

遞歸調(diào)用中用于UPSERT的場(chǎng)景,

業(yè)務(wù)邏輯設(shè)計(jì)中用來(lái)確保原子操作等。

ad lock的性能指標(biāo)

因?yàn)锳D LOCK很輕量化,不需要訪問(wèn)數(shù)據(jù),不需要執(zhí)行冗長(zhǎng)的代碼,所以很高效。

32核64線程機(jī)器測(cè)試可以達(dá)到131萬(wàn)次/s的鎖請(qǐng)求。

vi test.sql

\set id random(1,100000000)

select pg_try_advisory_xact_lock(:id);

pgbench -M prepared -n -r -P 1 -f ./test.sql -c 96 -j 96 -T 100transaction type: ./test.sql

scaling
factor: 1query mode: preparednumber of clients: 96number of threads:
96duration: 100 snumber of transactions actually processed:
131516823latency average = 0.072 ms

latency stddev = 0.070 ms

tps = 1314529.211060 (including connections establishing)

tps = 1315395.309707 (excluding connections establishing)script statistics:

– statement latencies in milliseconds: 0.001 \set id random(1,100000000) 0.074 select pg_try_advisory_xact_lock(:id);

ad lock用于秒殺的例子

在數(shù)據(jù)庫(kù)中,商品通常有唯一ID,我們可以對(duì)這個(gè)ID加鎖,(當(dāng)然,如果對(duì)不同的表這個(gè)ID有重疊的可能,我們可以加偏移量或者其他的手段來(lái)達(dá)到無(wú)沖突)。

加鎖成功才會(huì)去對(duì)行加鎖,執(zhí)行更新,這樣就能規(guī)避掉無(wú)效的行鎖等待,以及冗長(zhǎng)的查詢代碼。

使用 AD LOCK 對(duì)單條記錄的并發(fā)更新處理QPS可以達(dá)到39.1萬(wàn)/s,被秒殺的商品很快就會(huì)變成售罄狀態(tài),不會(huì)再浪費(fèi)數(shù)據(jù)庫(kù)的資源。

create table test(id int primary key, crt_time timestamp);insert into test values (1);vi test.sql

update test set crt_time=now() where id=1 and pg_try_advisory_xact_lock(1);

pgbench -M prepared -n -r -P 1 -f ./test.sql -c 64 -j 64 -T 100transaction type: ./test.sql

scaling
factor: 1query mode: preparednumber of clients: 64number of threads:
64duration: 100 snumber of transactions actually processed:
39104368latency average = 0.163 ms

latency stddev = 0.216 ms

tps = 391012.743072 (including connections establishing)

tps = 391175.983419 (excluding connections establishing)script statistics:

– statement latencies in milliseconds: 0.163 update test set crt_time=now() where id=1 and pg_try_advisory_xact_lock(1);

此時(shí)數(shù)據(jù)庫(kù)主機(jī)還有66.2%的空閑CPU資源可用使用。

top
– 13:12:43 up 51 days, 18:41, 2 users, load average: 1.12, 0.97,
0.78Tasks: 1463 total, 28 running, 1435 sleeping, 0 stopped, 0
zombieCpu(s): 24.5%us, 9.3%sy, 0.0%ni, 66.2%id, 0.0%wa, 0.0%hi, 0.0%si,
0.0%stMem: 529321832k total, 235226420k used, 294095412k free, 903076k
buffersSwap: 0k total, 0k used, 0k free, 62067636k cached

對(duì)比傳統(tǒng)的例子

傳統(tǒng)的消除等待的做法是這樣的,通過(guò)select for update nowait。

begin;select
1 from tbl where id=pk for update nowait; —
如果用戶無(wú)法即刻獲得鎖,則返回錯(cuò)誤。從而這個(gè)事務(wù)回滾。update tbl set xxx=xxx,upd_cnt=upd_cnt+1
where id=pk and upd_cnt+1<=5;end;

在PG中,可以使用do語(yǔ)句,把以上合成到一個(gè)塊里面操作。

使用傳統(tǒng)的方法,每秒可以處理8.6萬(wàn)。

vi
test.sqldo language plpgsql $$ declare begin with t as (select * from
test where id=1 for update nowait) update test set crt_time=now() from t
where t.id=test.id; exception when others then return; end; $$;

pgbench -M prepared -n -r -P 1 -f ./test.sql -c 64 -j 64 -T 100

transaction type: ./test.sql

scaling factor: 1

query mode: prepared

number of clients: 64

number of threads: 64

duration: 100 s

number of transactions actually processed: 8591222

latency average = 0.744 ms

latency stddev = 0.713 ms

tps = 85888.823884 (including connections establishing)

tps = 85924.666940 (excluding connections establishing)

script statistics:

– statement latencies in milliseconds:

0.744 do language plpgsql $$ declare begin with t as (select * from
test where id=1 for update nowait) update test set crt_time=now() from t
where t.id=test.id; exception when others then return; end; $$;

CPU剩余54.5%

top
– 13:13:48 up 51 days, 18:42, 2 users, load average: 8.14, 2.69,
1.37Tasks: 1464 total, 21 running, 1442 sleeping, 0 stopped, 1
zombieCpu(s): 41.7%us, 3.8%sy, 0.0%ni, 54.5%id, 0.0%wa, 0.0%hi, 0.0%si,
0.0%stMem: 529321832k total, 235256052k used, 294065780k free, 903176k
buffersSwap: 0k total, 0k used, 0k free, 62068308k cached

ad lock相比其他秒殺優(yōu)化的優(yōu)勢(shì)

淘寶雙11秒殺在哪個(gè)位置,淘寶0點(diǎn)0分0秒搶購(gòu)攻略,淘寶雙11秒殺

使用AD LOCK可以使得CPU開(kāi)銷最小化,等待最小化,從本文的測(cè)試CASE來(lái)看,單條記錄的更新可以達(dá)到39.1萬(wàn)/s。

傳統(tǒng)的手段只能達(dá)到8.6萬(wàn)/s。

使用AD LOCK不破壞ACID,單個(gè)請(qǐng)求單個(gè)事務(wù),不影響其他的事務(wù)。

合并優(yōu)化,本質(zhì)上是破壞了ACID的,如果合并失敗,會(huì)導(dǎo)致所有相關(guān)的請(qǐng)求失敗。

這篇文章的所有內(nèi)容到這里就完了,希望能幫助到你們,看完了淘寶雙11秒殺在哪個(gè)位置「秒懂:淘寶0點(diǎn)0分0秒搶購(gòu)攻略」,收獲很多,歡迎幫忙分享一下。我在這邊先謝謝各位了哈!

本文發(fā)布者:百事通,不代表巢座耶立場(chǎng),轉(zhuǎn)載請(qǐng)注明出處:http://www.sdwldmy.com/p/7742.html

版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 jubao226688#126.com 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。

(0)
上一篇 2023年5月30日 15:31
下一篇 2023年5月31日 08:49

相關(guān)推薦

  • 巴黎世家鞋子怎么鑒別 附:盤(pán)點(diǎn)世界十大奢侈品牌鞋子

    最近有很多朋友問(wèn)韓竹夢(mèng)關(guān)于巴黎世家鞋子怎么鑒別,盤(pán)點(diǎn)世界十大奢侈品牌鞋子的事情,還有關(guān)于巴黎世家鞋子這些的精品干貨文章,主要就是想給大家提供一個(gè)思路分享給大家,畢竟也是經(jīng)過(guò)一系列總結(jié)過(guò)的哈! 像幾十年前那種網(wǎng)面旅游鞋一樣的那個(gè)!”誤打誤撞,沒(méi)錯(cuò),老爹鞋還真是因?yàn)楹芟癜职帜且淮鷲?ài)穿的旅游鞋才這么命名的。 老爹鞋在市面上出現(xiàn)后,一躍而起成了銷量之王,現(xiàn)在基本在大…

    2023年10月27日 ? 百科
  • 快遞代收點(diǎn)怎么賺錢盈利 新手必看:新人開(kāi)一個(gè)菜鳥(niǎo)驛站多少費(fèi)用

    小伙伴們你們好,周禹曄很高興又和各位見(jiàn)面了,今天主要來(lái)講講快遞代收點(diǎn)怎么賺錢盈利,新人開(kāi)一個(gè)菜鳥(niǎo)驛站多少費(fèi)用,以及關(guān)于快遞代收點(diǎn)怎么賺錢等等各種相關(guān)干貨,如果你是老司機(jī),你可能覺(jué)得很簡(jiǎn)單,但如果你是新手,你可能就不這么想了。 在準(zhǔn)備入行快遞代收前,你肯定很好奇快遞代收點(diǎn)一個(gè)月能賺多少,快遞驛站雖然看上去比較小,但是它的真實(shí)收入像是一個(gè)謎。了解到了具體的收入情…

    2023年10月18日
  • 淘寶圖片尺寸多大合適 秒懂:淘寶主圖片尺寸的具體要求

    美好的1天將要從這里開(kāi)始啦!今天筆者錢珍多來(lái)說(shuō)說(shuō)淘寶圖片尺寸多大合適,淘寶主圖片尺寸的具體要求,以及淘寶圖片尺寸等等各種一系列的相關(guān)干貨,既然來(lái)了就別走了,好好的靜下心把這篇文章閱讀完相信你會(huì)有一定的收獲哦! 相信大多數(shù)商家還是比較熟悉淘寶這個(gè)平臺(tái)的,畢竟相對(duì)來(lái)說(shuō)不論是作為商家,還是作為消費(fèi)者,總歸或多或少的會(huì)在淘寶上進(jìn)行瀏覽和購(gòu)物操作的。而對(duì)于消費(fèi)者,就要…

    2024年4月13日
  • 省錢助手淘寶返利是真的嗎 詳細(xì)介紹:揭秘發(fā)鏈接給返利的安全嗎

    大家好,今天趙煜婷給大家準(zhǔn)備的干貨是省錢助手淘寶返利是真的嗎,揭秘發(fā)鏈接給返利的安全嗎,還有關(guān)于淘寶返利是真的嗎等等各種相關(guān)干貨,精心為你準(zhǔn)備的干貨,通過(guò)這篇文章相信你能有所收貨! 或者微 信客服。你的支付寶賬戶也能收到真是的返利資金的提現(xiàn),那么你們真的知道他們的運(yùn)作方式嗎? 相信大多數(shù)朋友跟趙煜婷一樣都是不管這些的,只知道能用就行。但是不知道其運(yùn)作方式趙煜…

    2023年8月21日 ? 百科
  • 營(yíng)業(yè)執(zhí)照網(wǎng)上辦理網(wǎng)站「推薦網(wǎng)上申請(qǐng)營(yíng)業(yè)執(zhí)照步驟」

    很高興又和各位見(jiàn)面啦!這次陳楚想和你們聊聊營(yíng)業(yè)執(zhí)照網(wǎng)上辦理網(wǎng)站,網(wǎng)上申請(qǐng)營(yíng)業(yè)執(zhí)照步驟,以及營(yíng)業(yè)執(zhí)照網(wǎng)上辦理的相關(guān)內(nèi)容干貨,認(rèn)真閱讀完,把我想表達(dá)的思路完全理解,相信你很快就可以掌握! 既然大家都有些懵,我就梳理一下我如何辦理營(yíng)業(yè)執(zhí)照的吧。 我在2020年11月20號(hào)左右決定開(kāi)問(wèn)尋蔬果店,打算申請(qǐng)營(yíng)業(yè)執(zhí)照,問(wèn)尋蔬果店的位置是:北京昌平沙河路莊。我去工商所了解情…

    2023年3月14日 ? 百科
  • 淘寶怎么直播賣貨 新手必看:淘寶直播賣貨技巧分享

    HI,小伙伴們你們好,今天許少煜比較忙,抽個(gè)時(shí)間來(lái)說(shuō)下關(guān)于淘寶怎么直播賣貨,淘寶直播賣貨技巧分享,還有關(guān)于淘寶怎么直播這些的精品干貨文章,認(rèn)認(rèn)真真閱讀完,若能把我想表達(dá)的全部理解,相信你已經(jīng)離大牛不遠(yuǎn)了哈! 雖然我們都知道淘寶直播最終將成為電子商標(biāo),如標(biāo)題,關(guān)鍵詞,直通車,演出節(jié)目和詳情頁(yè)面,它肯定會(huì)淡化已經(jīng)在幾分鐘內(nèi)售出的光環(huán),但現(xiàn)在淘寶直播如此火爆,很快…

    2024年3月4日