最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解密Redis助力雙11背后電商秒殺系統(tǒng)(推薦)

 更新時(shí)間:2020年10月29日 14:33:09   作者:海嘍世界  
這篇文章主要介紹了解密Redis助力雙11背后電商秒殺系統(tǒng),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

背景

秒殺活動(dòng)是絕大部分電商選擇的低價(jià)促銷,推廣品牌的方式。既可以給平臺(tái)帶來用戶量,還可以提高平臺(tái)知名度。一個(gè)好的秒殺系統(tǒng),可以提高平臺(tái)系統(tǒng)的穩(wěn)定性和公平性,獲得更好的用戶體驗(yàn),提升平臺(tái)的口碑,從而提升秒殺活動(dòng)的最大價(jià)值。

本文討論云數(shù)據(jù)庫Redis版緩存設(shè)計(jì)高并發(fā)的秒殺系統(tǒng)。

秒殺的特征

秒殺活動(dòng)對(duì)稀少或特價(jià)的商品進(jìn)行定時(shí)定量售賣,吸引成大量的消費(fèi)者進(jìn)行搶購,但又只有少部分消費(fèi)者可以下單成功。因此,秒殺活動(dòng)將在一定時(shí)間內(nèi)產(chǎn)生比平時(shí)大幾十倍倍,上百倍的頁面訪問流量和下單請(qǐng)求流量。

秒殺活動(dòng)可以分為3個(gè)階段:

  • 秒殺前:用戶不斷刷新商品詳情頁,頁面請(qǐng)求達(dá)到臨時(shí)開頭。
  • 秒殺開始:用戶點(diǎn)擊秒殺按鈕,下單請(qǐng)求達(dá)到暫時(shí)提前。
  • 秒殺后:一部分成功下單的用戶不斷刷新訂單或產(chǎn)生退單操作,大部分用戶繼續(xù)刷新商品詳情頁等待退單機(jī)會(huì)。

消費(fèi)者提交的訂單,一般做法是利用數(shù)據(jù)庫的行級(jí)鎖,只有搶到鎖的請(qǐng)求可以進(jìn)行庫存查詢和下單操作。但是在高并發(fā)的情況下,數(shù)據(jù)庫無法承受如此大的請(qǐng)求,往往需要整個(gè)服務(wù)被阻止,在消費(fèi)者看來就是服務(wù)器停機(jī)機(jī)。

秒殺系統(tǒng)

利用系統(tǒng)的層次結(jié)構(gòu),在每個(gè)階段提前重新驗(yàn)證,攔截?zé)o效流量,可以減少大量無效的流量涌入數(shù)據(jù)庫。

利用瀏覽器緩存和CDN抗壓靜態(tài)頁面流量

因此,我們需要把秒殺商品詳情頁與普通的商品詳情頁分開。關(guān)于秒殺商品詳情頁試圖將能靜態(tài)化的元素靜態(tài)化處理,除了秒殺按鈕需要服務(wù)端進(jìn)行動(dòng)態(tài)判斷,其他的靜態(tài)數(shù)據(jù)可以緩存在瀏覽器和CDN上。這樣,秒殺前刷新頁面導(dǎo)致的流量進(jìn)入服務(wù)端的流量只有很小的一部分。

利用識(shí)讀分離Redis緩存攔截流量

CDN是第一級(jí)流量攔截,第二級(jí)流量攔截我們使用支持讀寫分離的Redis。在這一階段我們主要讀取數(shù)據(jù),讀取分離Redis能支持高達(dá)60萬以上qps,完全可以支持需求。

首先通過數(shù)據(jù)控制模塊,提前將秒殺商品緩存到標(biāo)識(shí)符分離Redis,并設(shè)置秒殺開始標(biāo)記如下:

"goodsId_count": 100 //總數(shù)
"goodsId_start": 0 //開始標(biāo)記
"goodsId_access": 0 //接受下單數(shù)
  • 秒殺開始前,服務(wù)重新讀取goodsId_Start為0,直接返回未開始。
  • 數(shù)據(jù)控制模塊將goodsId_start改為1,標(biāo)志秒殺開始。
  • 服務(wù)最大化緩存開始標(biāo)記位并開始接受請(qǐng)求,并記錄到redis中g(shù)oodsId_access,商品剩余數(shù)量為(goodsId_count-goodsId_access)。
  • 當(dāng)接受下單數(shù)達(dá)到goodsId_count后,繼續(xù)攔截所有請(qǐng)求,商品剩余數(shù)量為0。

可以拋光,最后成功參與下單的請(qǐng)求只有少部分可以被接受。在高并發(fā)的情況下,允許稍微多的流量進(jìn)入。因此可以控制接受下單數(shù)的比例。

利用主從版Redis緩存加速庫存扣量

成功避免下單后,進(jìn)入下層服務(wù),開始進(jìn)行訂單信息校驗(yàn),庫存扣量。為了避免直接訪問數(shù)據(jù)庫,我們使用主從版Redis來進(jìn)行庫存扣量,主從版Redis提供10萬等級(jí)的QPS。使用Redis來優(yōu)化庫存查詢,提前攔截秒殺失敗的請(qǐng)求,將大大提高系統(tǒng)的整體穩(wěn)定性。

通過數(shù)據(jù)控制模塊提前將庫存存入Redis,將每個(gè)秒殺商品在Redis中用一個(gè)hash結(jié)構(gòu)表示。

"goodsId" : {
 "Total": 100
 "Booked": 100
}

扣量時(shí),服務(wù)器通過請(qǐng)求Redis獲取下單資格,通過以下lua腳本實(shí)現(xiàn),通過Redis是單線程模型,lua可以保證多個(gè)命令的原子性。

local n = tonumber(ARGV[1])
if not n or n == 0 then
 return 0
end
local vals = redis.call("HMGET", KEYS[1], "Total", "Booked");
local total = tonumber(vals[1])
local blocked = tonumber(vals[2])
if not total or not blocked then
 return 0
end
if blocked + n <= total then
 redis.call("HINCRBY", KEYS[1], "Booked", n)
 return n;
end
return 0

先使用SCRIPT LOAD將lua腳本EVALSHA預(yù)先緩存在Redis,然后調(diào)用調(diào)用腳本,比直接調(diào)用EVAL節(jié)省網(wǎng)絡(luò)帶寬:

redis 127.0.0.1:6379>SCRIPT LOAD "lua code"
"438dd755f3fe0d32771753eb57f075b18fed7716"
redis 127.0.0.1:6379>EVAL 438dd755f3fe0d32771753eb57f075b18fed7716 1 goodsId 1

秒殺服務(wù)通過判斷Redis是否返回?fù)屬弬€(gè)數(shù)n,即可知道此次請(qǐng)求是否扣量成功。

使用主從版Redis實(shí)現(xiàn)簡(jiǎn)單的消息異步下單入庫

如果商品數(shù)量減少的時(shí)候,直接操作數(shù)據(jù)庫即可。如果秒殺的商品是1萬,甚至10萬等級(jí),那數(shù)據(jù)庫鎖沖突將帶來很大的性能優(yōu)勢(shì)。。因此,利用消息組件,當(dāng)秒殺服務(wù)將訂單信息寫入消息變量后,即可認(rèn)為下單完成,避免直接操作數(shù)據(jù)庫。

消息模塊組件依然可以使用Redis實(shí)現(xiàn),在R2中用列表數(shù)據(jù)結(jié)構(gòu)表示。

```java
  orderList {
   [0] = {訂單內(nèi)容}
   [1] = {訂單內(nèi)容}
   [2] = {訂單內(nèi)容}
   ...
  }

將訂單內(nèi)容寫入

```java
 LPUSH orderList {訂單內(nèi)容}

初步下單模塊從Redis中順序獲取訂單信息,將訂單寫入數(shù)據(jù)庫。

```java
  BRPOP orderList 0

通過使用Redis作為消息收發(fā)器,異步處理訂單入庫,有效的提高了用戶的下單完成速度。

數(shù)據(jù)控制模塊管理秒殺數(shù)據(jù)同步

最開始,利用識(shí)別分離Redis進(jìn)行流量限制,只讓部分流量進(jìn)入下單。對(duì)于下單檢驗(yàn)失敗和退單等情況,需要讓更多的流量進(jìn)來。因此,數(shù)據(jù)控制模塊需要定時(shí)將數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行一定的計(jì)算,同步到主從版Redis,同時(shí)再同步到讀寫分離的Redis,讓更多的流量進(jìn)來。

總結(jié)

到此這篇關(guān)于解密Redis助力雙11背后電商秒殺系統(tǒng)的文章就介紹到這了,更多相關(guān)redis電商秒殺系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis專屬鏈表ziplist的使用

    redis專屬鏈表ziplist的使用

    本文主要介紹了redis專屬鏈表ziplist的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 如何用redis?setNX命令來加鎖

    如何用redis?setNX命令來加鎖

    這篇文章主要介紹了如何用redis?setNX命令來加鎖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Redis內(nèi)存碎片率調(diào)優(yōu)處理方式

    Redis內(nèi)存碎片率調(diào)優(yōu)處理方式

    Redis集群因內(nèi)存碎片率超過1.5觸發(fā)告警,分析發(fā)現(xiàn)內(nèi)因與外因?qū)е聝?nèi)存碎片,內(nèi)因?yàn)椴僮飨到y(tǒng)內(nèi)存分配機(jī)制,外因?yàn)镽edis操作特性,使用Redis內(nèi)置內(nèi)存碎片清理機(jī)制可有效降低碎片率,但需注意可能影響性能,建議使用MEMORY命令診斷內(nèi)存使用情況,合理配置參數(shù)以優(yōu)化性能
    2024-09-09
  • redis分布式鎖的go-redis實(shí)現(xiàn)方法詳解

    redis分布式鎖的go-redis實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了redis分布式鎖的go-redis實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Redis整合Lua腳本的實(shí)現(xiàn)操作

    Redis整合Lua腳本的實(shí)現(xiàn)操作

    Redis對(duì)lua腳本的支持是從Redis2.6.0版本開始引入的,它可以讓用戶在Redis服務(wù)器內(nèi)置的Lua解釋器中執(zhí)行指定的lua腳本,本文就來介紹一下Redis整合Lua腳本的實(shí)現(xiàn),感興趣的可以了解一下
    2024-03-03
  • Redis使用RedisTemplate導(dǎo)致key亂碼問題解決

    Redis使用RedisTemplate導(dǎo)致key亂碼問題解決

    本文主要介紹了Redis使用RedisTemplate導(dǎo)致key亂碼問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • redis.clients.jedis.exceptions.JedisDataException異常的錯(cuò)誤解決

    redis.clients.jedis.exceptions.JedisDataException異常的錯(cuò)誤解決

    本文主要介紹了redis.clients.jedis.exceptions.JedisDataException異常的錯(cuò)誤解決,這個(gè)異常通常發(fā)生在嘗試連接到一個(gè)?Redis?服務(wù)器時(shí),客戶端發(fā)送了一個(gè)?AUTH?命令來驗(yàn)證密碼,但是沒有配置密碼驗(yàn)證,下來就來解決一下
    2024-05-05
  • 圖解Redis主從復(fù)制與Redis哨兵機(jī)制

    圖解Redis主從復(fù)制與Redis哨兵機(jī)制

    這篇文章主要介紹了圖解Redis主從復(fù)制與Redis哨兵機(jī)制,今天分享一下Redis的持久化、事務(wù)、管道相關(guān)的知識(shí)點(diǎn),需要的朋友可以參考下
    2023-03-03
  • Redis實(shí)現(xiàn)分布式鎖的五種方法詳解

    Redis實(shí)現(xiàn)分布式鎖的五種方法詳解

    在分布式架構(gòu)中,我們同樣會(huì)遇到數(shù)據(jù)共享操作問題,本文章使用Redis來解決分布式架構(gòu)中的數(shù)據(jù)一致性問題,需要的小伙伴可以參考一下
    2022-06-06
  • Redis在Ubuntu系統(tǒng)上無法啟動(dòng)的問題排查

    Redis在Ubuntu系統(tǒng)上無法啟動(dòng)的問題排查

    這篇文章主要介紹了Redis在Ubuntu系統(tǒng)上無法啟動(dòng)的問題排查,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08

最新評(píng)論

聂荣县| 海丰县| 英超| 林芝县| 平和县| 嘉黎县| 噶尔县| 偏关县| 尼玛县| 屯留县| 若尔盖县| 永靖县| 怀化市| 平安县| 周宁县| 阿勒泰市| 甘德县| 平阴县| 永宁县| 开远市| 拜城县| 石林| 门头沟区| 巴马| 灌云县| 孙吴县| 浏阳市| 通化市| 儋州市| 长春市| 新邵县| 洪江市| 雅安市| 汉寿县| 开平市| 突泉县| 开封市| 广宁县| 巴青县| 巴林左旗| 高碑店市|