欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

redis秒殺系統(tǒng)的實(shí)現(xiàn)

 更新時(shí)間:2022年06月01日 10:38:53   作者:NineSun  
秒殺在很多活動(dòng)大促中都可以用到,本文主要介紹了redis秒殺系統(tǒng)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1.如何設(shè)計(jì)一個(gè)秒殺系統(tǒng)

在設(shè)計(jì)任何系統(tǒng)之前,我們首先都需要先理解秒殺系統(tǒng)的業(yè)務(wù)背景

下面我簡(jiǎn)單的舉一個(gè)例子:

在某個(gè)時(shí)間點(diǎn),某某電商網(wǎng)站要低價(jià)賣某件商品,而且限量1千件,搶購人數(shù)超過數(shù)十萬人。
所以我們面臨的第一個(gè)秒殺的問題就是:時(shí)間極短,然后瞬間流量非常大
我們的系統(tǒng)必須保證秒殺搶購的結(jié)果不出錯(cuò),達(dá)到搶購的預(yù)期目的。
而且秒殺庫存的實(shí)現(xiàn)也需要保障秒殺結(jié)果的準(zhǔn)確性。
總結(jié)幾個(gè)特點(diǎn)就是:

  • 高性能:秒殺中有大量的并發(fā)讀寫,所以需要使系統(tǒng)能支撐起高并發(fā)訪問,這是一個(gè)關(guān)鍵點(diǎn)。
  • 高可用:藐視瞬間流量非常大,很有可能會(huì)導(dǎo)致系統(tǒng)宕機(jī),所以需要從各方面保證系統(tǒng)的可用性。
  • 一致性:由于秒殺請(qǐng)求量非常大,此時(shí)就需要我們的秒殺結(jié)果要準(zhǔn)確。因?yàn)橐坏┏鲥e(cuò),那么波及面會(huì)非常廣,損失非常大。

2.秒殺流程

我們先從秒殺的入口開始說起
在秒殺入口的地方會(huì)有這些問題需要解決:

2.1 前端處理

靜態(tài)資源處理

秒殺商品一般都會(huì)包含很多靜態(tài)資源,所以這些圖片什么的靜態(tài)資源一定要放到CDN(Content Delivery Network,即內(nèi)容分發(fā)網(wǎng)絡(luò)),能放的盡量放進(jìn)去。讓秒殺時(shí)后端服務(wù)器的壓力盡可能小。
說到此處,我重點(diǎn)描述講解CDN

為了能在傳統(tǒng)IP網(wǎng)上發(fā)布豐富的寬帶媒體內(nèi)容,提出在現(xiàn)有互聯(lián)網(wǎng)基礎(chǔ)上建立一個(gè)內(nèi)容分發(fā)平臺(tái)專門為網(wǎng)站提供服務(wù)。由于CDN是為加快網(wǎng)絡(luò)訪問速度而被優(yōu)化的網(wǎng)絡(luò)覆蓋層,因此被形象地稱為“網(wǎng)絡(luò)加速器”。
首先要說的是應(yīng)用服務(wù)器和資源服務(wù)器應(yīng)該解耦,也就是應(yīng)用服務(wù)器只處理邏輯,而資源服務(wù)器存放內(nèi)容或者叫資源。

  • CDN專注于「內(nèi)容」,也就是CDN的C所代表的Content,專注于靜態(tài)資源的分發(fā)和訪問,比如一張圖片,一個(gè)文本文件,一個(gè)視頻,一個(gè)CSS,一個(gè)JS等等,任何以文件形式存儲(chǔ)的,為了提高在互聯(lián)網(wǎng)上的訪問速度和質(zhì)量,都可以將這個(gè)資源部署在CDN這個(gè)網(wǎng)絡(luò)上。
  • CDN動(dòng)作是「分發(fā)」,也就是如何讓剛才提到的那些「內(nèi)容」快速的部署在這個(gè)網(wǎng)絡(luò)中,從而快速為用戶服務(wù),其實(shí)還有一層更重要的含義是用戶的快速訪問與就近接入,分發(fā)的目的是為了用戶更好的體驗(yàn)。
  • CDN落定于「網(wǎng)絡(luò)」,是部署于全國或者全世界的一大堆服務(wù)器,這些服務(wù)器基于當(dāng)前互聯(lián)網(wǎng)的基礎(chǔ)架構(gòu)在其上層再構(gòu)成一個(gè)網(wǎng)絡(luò),這個(gè)網(wǎng)絡(luò)專為資源分發(fā)而生。

那CDN的原理是什么呢?為什么用戶可以接入離他最近的服務(wù)器呢?
主要是利用了DNS來判斷用戶位置,再返回給用戶最近的機(jī)房的服務(wù)器的資源地址。
下面我再通俗的解釋一下:
肯德基的總部在美國,可是你家樓下也有一家肯德基,并且漢堡包是一模一樣的,這就是CDN(這個(gè)比喻來自知乎,覺得非常的恰當(dāng))??系禄渴鹆撕芏鄠€(gè)CDN在世界各地提供服務(wù),用戶都是找到最近的店,這個(gè)計(jì)算過程就是剛才講的「就近接入」。

什么是CDN的調(diào)度呢?

(1)DNS調(diào)度是最常用和最通用的調(diào)度方案,缺點(diǎn)是存在DNS劫持的風(fēng)險(xiǎn),調(diào)度的精確度也會(huì)差一些;
(2)302調(diào)度非常適合用在大文件下載和視頻點(diǎn)播這兩個(gè)應(yīng)用場(chǎng)景,優(yōu)點(diǎn)是可以提高調(diào)度的精確度,缺點(diǎn)是將會(huì)增加首包的時(shí)延(在大文件下載和視頻點(diǎn)播場(chǎng)景下對(duì)首包時(shí)延不太敏感,而對(duì)調(diào)度精確度要求更高)
(3)HTTPDNS調(diào)度的優(yōu)點(diǎn)是有較高的安全性(可以規(guī)避DNS劫持風(fēng)險(xiǎn))和調(diào)度精確度,但是有個(gè)很大的缺點(diǎn),需要客戶端提供支持(例如在手機(jī)APP上嵌入SDK),通用性較差。

通俗來講:

在一個(gè)商圈有兩家肯德基,有一家組織活動(dòng),雞腿隨便吃,所以顧客全部涌到這家店,已經(jīng)水泄不通,另一家店則門可羅雀。這個(gè)時(shí)候CDN的調(diào)度功能就要發(fā)揮作用了,另一家店也發(fā)布了一個(gè)消息說,買一個(gè)漢堡,打五折。這個(gè)時(shí)候,在第一家店搶不上雞腿的顧客,馬上跑去了第二家店,這個(gè)時(shí)候兩個(gè)店的流量處于均衡狀態(tài)。這就是CDN的調(diào)度。

惡意訪問行為的處理

當(dāng)我們推出秒殺活動(dòng)后,還需要考慮黃牛黨們開發(fā)出的各種秒殺器,可以自動(dòng)填單,自動(dòng)回答各種問題,以及自動(dòng)模擬點(diǎn)擊等,令我們防不勝防。
針對(duì)這些我們可以通過各種工作來限制和識(shí)別這些惡意訪問。

  • 例如限制IP的提交次數(shù)
  • 提高各種動(dòng)態(tài)驗(yàn)證碼及問題的難度
  • 增加黑名單賬戶

秒殺鏈接隱藏

如果稍微懂點(diǎn)程序的人可以提前拿到秒殺鏈接,那么就可以通過程序在最快的時(shí)間發(fā)起秒殺請(qǐng)求,這樣人家就可以拿到大部分商品了。為了防止這一點(diǎn),可以使秒殺鏈接動(dòng)態(tài)化。使用MD5算法等加密隨機(jī)字符串作為URL的一部分,秒殺開始后才將連接放出來,同時(shí)在后臺(tái)進(jìn)行校驗(yàn),此時(shí)已經(jīng)可以防止一大批的羊毛黨了。

前端限流

可以在秒殺按鈕點(diǎn)擊之后灰掉幾秒鐘,幾秒鐘之內(nèi)只能點(diǎn)擊一次。
可以使用Nginx用戶請(qǐng)求到Nginx的時(shí)候?qū)⒘髁糠稚⒌蕉鄠€(gè)服務(wù)器上,而且也可以針對(duì)用戶進(jìn)行一些過濾,將一些請(qǐng)求攔截,保證后端的穩(wěn)定性。比如1萬個(gè)商品,最多放進(jìn)來10萬個(gè)請(qǐng)求就可以了,其他的用戶就只能等著靜態(tài)頁面嘍。同時(shí)也可以在秒殺預(yù)約的時(shí)候隨機(jī)發(fā)放一些token,只有擁有這些token的客戶才有可能搶購成功。
同時(shí)在分布式的架構(gòu)下,我們也可以通過gateway,redis+lua或者nginx進(jìn)行限流

2.2 后端處理

后端限流

如果服務(wù)的流量到達(dá)最大值的時(shí)候,新的請(qǐng)求就不能再進(jìn)來了。
而服務(wù)宕機(jī)的時(shí)候也需要引導(dǎo)請(qǐng)求到備用服務(wù)器上面,然后返回一些靜態(tài)提示頁面等。
隔離就要求,秒殺的服務(wù)單獨(dú)部署,只承擔(dān)其秒殺的單一職責(zé),即使出問題,也不會(huì)影響其他的服務(wù)。

削峰

秒殺流量在某一個(gè)時(shí)間點(diǎn)非常高,那么我們讓瞬間進(jìn)來的流量進(jìn)到一個(gè)緩沖池,然后再進(jìn)行平緩處理。比較多用到的方案就是使用消息隊(duì)列來處理。

庫存預(yù)熱

由于秒殺的商品的數(shù)量一般都是提前已知的,這時(shí)我們可以提前將商品的一些數(shù)據(jù)提前加載到緩存中。并且可以將商品分區(qū)來進(jìn)行秒殺,根據(jù)每個(gè)大區(qū)的用戶數(shù)量以及活躍程度,為每個(gè)大區(qū)分配單獨(dú)的秒殺商品數(shù)量。這樣也可以分散服務(wù)器壓力。

使用緩存

高并發(fā)的情況下必然會(huì)遇到緩存雪崩,緩存擊穿,緩存穿透等問題。而且秒殺的場(chǎng)景是讀多寫少,使用Redis作為緩存非常合適,為了避免單臺(tái)Redis服務(wù)器出問題,導(dǎo)致緩存擊穿等問題,升級(jí)使用Redis集群是一個(gè)比較好的方案。提升可用性的性能也可以大大提高。
下面我簡(jiǎn)單說一下緩存雪崩,緩存擊穿以及緩存穿透

首先我們要先了解一下緩存的處理流程
前臺(tái)請(qǐng)求,后臺(tái)先從緩存中取數(shù)據(jù),取到直接返回結(jié)果,取不到時(shí)從數(shù)據(jù)庫中取,數(shù)據(jù)庫取到更新緩存,并返回結(jié)果,數(shù)據(jù)庫也沒取到,那直接返回空結(jié)果。

知道什么是緩存之后我們重點(diǎn)來了解一下這三個(gè)名次具體指什么,以及如何去解決
緩存穿透
描述:緩存穿透是指緩存和數(shù)據(jù)庫中都沒有的數(shù)據(jù),而用戶不斷發(fā)起請(qǐng)求,如發(fā)起為id為“-1”的數(shù)據(jù)或id為特別大不存在的數(shù)據(jù)。這時(shí)的用戶很可能是攻擊者,攻擊會(huì)導(dǎo)致數(shù)據(jù)庫壓力過大。
解決方案:

  • 接口層增加校驗(yàn),如用戶鑒權(quán)校驗(yàn),id做基礎(chǔ)校驗(yàn),id<=0的直接攔截;
  • 從緩存取不到的數(shù)據(jù),在數(shù)據(jù)庫中也沒有取到,這時(shí)也可以將key-value對(duì)寫為key-null,緩存有效時(shí)間可以設(shè)置短點(diǎn),如30秒(設(shè)置太長會(huì)導(dǎo)致正常情況也沒法使用)。這樣可以防止攻擊用戶反復(fù)用同一個(gè)id暴力攻擊

緩存擊穿
描述: 緩存擊穿是指緩存中沒有數(shù)據(jù)但數(shù)據(jù)庫中有的數(shù)據(jù)(一般是緩存時(shí)間到期),這時(shí)由于并發(fā)用戶特別多,同時(shí)讀緩存沒讀到數(shù)據(jù),又同時(shí)去數(shù)據(jù)庫去取數(shù)據(jù),引起數(shù)據(jù)庫壓力瞬間增大,造成過大壓力。
解決方案:

  • 設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期。
  • 加互斥鎖,互斥鎖參考代碼如下

我簡(jiǎn)單解釋一下代碼思路:
我們首先從緩存中獲取數(shù)據(jù),如果數(shù)據(jù)不存在,我們則去獲取鎖,這把鎖 只需要能夠互斥,可重入即可,最簡(jiǎn)單的就是redis的setnx來實(shí)現(xiàn),獲取鎖資源以后,從數(shù)據(jù)庫讀取數(shù)據(jù),同時(shí)將數(shù)據(jù)更新至緩存,然后釋放鎖;如果獲取鎖資源失敗,我們就讓其隔一段時(shí)間之后重新嘗試去獲取鎖資源。

緩存雪崩
緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時(shí)間,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫壓力過大甚至down機(jī)。
和緩存擊穿不同的是,緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是不同數(shù)據(jù)都過期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫。
解決方案:

  • 緩存數(shù)據(jù)的過期時(shí)間設(shè)置隨機(jī),防止同一時(shí)間大量數(shù)據(jù)過期現(xiàn)象發(fā)生。
  • 如果緩存數(shù)據(jù)庫是分布式部署,將熱點(diǎn)數(shù)據(jù)均勻分布在不同搞得緩存數(shù)據(jù)庫中。
  • 設(shè)置熱點(diǎn)數(shù)據(jù)永遠(yuǎn)不過期。

3.超賣問題

秒殺中一個(gè)重要的點(diǎn)就是超賣問題,由于搶購人數(shù)多,流量也很大,但是也不能賣多了。
目前常見的解決方案就是:

1.數(shù)據(jù)庫要加唯一索引,減庫存的時(shí)候要先進(jìn)行庫存數(shù)量判斷等,數(shù)據(jù)庫鎖,加版本號(hào)的樂觀鎖方式等等。2

.采用Redis來維護(hù)庫存,由于秒殺活動(dòng)可以預(yù)先知道商品的數(shù)量,所以可以提前將商品的數(shù)據(jù)加載到Redis中,如果Redis的庫存不足的話則秒殺失敗。

3.生成訂單的時(shí)候?qū)⒄?qǐng)求放到服務(wù)端的異步隊(duì)列中去處理,可以使用Redis的隊(duì)列,或者M(jìn)Q均可。

4.總體思路

其實(shí)秒殺方案的總體思路也很簡(jiǎn)單:

1.盡可能的將請(qǐng)求攔截在上游;

2.后端均要處理限流;

3.盡量減少請(qǐng)求到數(shù)據(jù)庫;

4.多利用緩存;

5.使用異步操作-可以使用隊(duì)列等;

6.秒殺服務(wù)單一職責(zé);

7.盡早失敗,讓秒殺請(qǐng)求返回

到此這篇關(guān)于redis秒殺系統(tǒng)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)redis 秒殺系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis發(fā)布訂閱_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    redis發(fā)布訂閱_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了redis發(fā)布訂閱,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • Redis Cluster添加、刪除的完整操作步驟

    Redis Cluster添加、刪除的完整操作步驟

    這篇文章主要給大家介紹了關(guān)于Redis Cluster添加、刪除的完整操作步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09
  • Redis實(shí)戰(zhàn)之Lettuce的使用技巧詳解

    Redis實(shí)戰(zhàn)之Lettuce的使用技巧詳解

    Lettuce?是?Redis?的一款高級(jí)?Java?客戶端,與?Jedis?并列成為最熱門的客戶端之一,目前已成為?SpringBoot?2.0?版本默認(rèn)的?redis?客戶端。本文主要和大家講講Lettuce的使用技巧,感興趣的可以了解一下
    2022-12-12
  • redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解

    redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解

    這篇文章主要介紹了redis數(shù)據(jù)結(jié)構(gòu)之intset的實(shí)例詳解的相關(guān)資料, intset也即整數(shù)集合,當(dāng)集合保存的值數(shù)量不多時(shí),redis使用intset作為其底層數(shù)據(jù)保存結(jié)構(gòu),希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • Linux中設(shè)置Redis開機(jī)啟動(dòng)的方法

    Linux中設(shè)置Redis開機(jī)啟動(dòng)的方法

    這篇文章主要給大家介紹了關(guān)于Linux中設(shè)置Redis開機(jī)啟動(dòng)的方法,主要包括在CentOS7.0系統(tǒng)和Debian 8.0系統(tǒng)下實(shí)現(xiàn)方法,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • Redis?List列表相關(guān)命令的用法詳解

    Redis?List列表相關(guān)命令的用法詳解

    這篇文章主要為大家詳細(xì)介紹了Redis中List列表相關(guān)命令的用法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • redis中l(wèi)ua腳本使用教程

    redis中l(wèi)ua腳本使用教程

    在使用redis的過程中,發(fā)現(xiàn)有些時(shí)候需要原子性去操作redis命令,而redis的lua腳本正好可以實(shí)現(xiàn)這一功能。這篇文章主要介紹了redis中l(wèi)ua腳本的簡(jiǎn)單使用,需要的朋友可以參考下
    2021-10-10
  • Redis安裝及基本數(shù)據(jù)類型

    Redis安裝及基本數(shù)據(jù)類型

    這篇文章主要介紹了Redis安裝及基本數(shù)據(jù)類型,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • 使用Redis實(shí)現(xiàn)令牌桶算法原理解析

    使用Redis實(shí)現(xiàn)令牌桶算法原理解析

    這篇文章主要介紹了使用Redis實(shí)現(xiàn)令牌桶算法,該算法可以應(yīng)對(duì)短暫的突發(fā)流量,這對(duì)于現(xiàn)實(shí)環(huán)境中流量不怎么均勻的情況特別有用,不會(huì)頻繁的觸發(fā)限流,對(duì)調(diào)用方比較友好,需要的朋友可以參考下
    2021-12-12
  • 詳解Redis基本命令與使用場(chǎng)景

    詳解Redis基本命令與使用場(chǎng)景

    REmote DIctionary Server(Redis)是一個(gè)由Salvatore Sanfilippo寫的key-value 存儲(chǔ)系統(tǒng),是跨平臺(tái)的非關(guān)系型數(shù)據(jù)庫,是一個(gè)開源的使用ANSI C語言編寫、遵守BSD協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存、分布式、可選持久性的鍵值對(duì)(Key-Value)存儲(chǔ)數(shù)據(jù)庫,并提供多種語言的 API。
    2021-06-06

最新評(píng)論