藉助Redis做秒殺和限流的思考

来源:https://www.cnblogs.com/nnhy/archive/2018/01/17/Seckill.html
-Advertisement-
Play Games

最近群里聊起秒殺和限流,我自己沒有做過類似應用,但是工作中遇到過更大的數據和併發。 於是提出了一個簡單的模型: var count = rds.inc(key); if(count > 1000) throw "已搶光!" 藉助Redis單線程模型,它的inc是安全的,確保每次加一,然後返回加一後的 ...


最近群里聊起秒殺和限流,我自己沒有做過類似應用,但是工作中遇到過更大的數據和併發。

於是提出了一個簡單的模型:

var count = rds.inc(key);

if(count > 1000) throw "已搶光!"

藉助Redis單線程模型,它的inc是安全的,確保每次加一,然後返回加一後的結果。如果原來是234,加一了就是235,返回的一定是235,在此中間,不會有別的請求來打斷從而導致返回236或者其它。

其實我們可以理解為inc的業務就是占坑排隊,每人占一個坑,拿到排隊小票後看看是不是超額了,再從業務層面輸出秒殺結果,甚至做一些更加複雜的業務。

六條提到限流,可能基於某種考慮,希望把key對應的count給限制在1000附近,可以接受1%偏差。

於是有了改進模型:

var count = rds.inc(key);

if(count > 1000){

    rds.dec(key);

    throw "超出限額!"

就加了一句,超出限額後,把小票給減回去^_^

 

採用Redis有一個好處,比如支持很多應用伺服器一起搶……

當然,對於很大量的秒殺,這個模型也不一定合理,比如要槍10萬部手機,然後來了300萬用戶,瞬間擠上來。

這裡有個變通方法可以試一下,那就是準備10個Redis實例,每個放1萬。用戶請求過來的時候,可以隨機數或者散列取模,找對應實例來進行搶購。

同理可以直接更多用戶的場景。總的來說,在數據較大的時候,隨機和散列就具有一定統計學意義,相對來說是比較均衡的。

 

上面是大量秒殺的簡單場景,那麼小數據場景呢?比如就只有幾萬併發的場景

小數據場景,單應用實例,可以考慮把Redis都給省了。

初級模型:

Interlocked.Increase(ref count);

if(count >= 1000) throw "搶光啦!"

中級模型:

private volatile Int32 count;

var old = 0;

do {

    old = count;

    if(old >= 1000) throw "搶光啦!"

}while(Interlocked.CompareExchange(ref count, old + 1, old) != old);

這個CAS原子操作可是好東西,在x86指令集下有專門指令CMPXCHG來處理,在處理器級別確保比較和交換數據的原子性。大多數系統想要邁過10萬tps的門檻向100萬tps靠齊,就必須得實現無鎖操作lock-free,其中CAS是最為簡單易懂,儘管有時候有ABA問題,但我們可以找到許多解決辦法。

 

在實際使用場景中,可能有更複雜的需求,那就另當別論,這裡只能班門弄斧幾個簡單易用的模型。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 下麵是這本書序言中的大部分內容,本人的英文水平有限,有理解不到位的地方還請大家指教,這算是自己對這本書的筆記和總結。 數據是當今系統設計中許多挑戰的中心,一些難以解決的問題如系統的可擴展性,一致性,可靠性,有效性和可維護性等需要弄清楚。 另外,我們已經有了各式各樣的工具,包括關係型資料庫,NoSQL ...
  • 1、資料庫操作 1.1、連接mysql伺服器 mysql -u root( 用戶名 ) -p 1.2、退出mysql命令提示窗 exit 1.3、查看版本 SELECT VERSION(); 1.4、列出資料庫列表 SHOW DATABASES; 1.5、創建資料庫 CREATE DATABASE ...
  • 各位小伙伴,又到了本期分享大數據技術的時間,本次給大伙帶來的是Elasticsearch這個技術,閑話不多聊,我們開始進入正題。 一、什麼是elasticsearch Elasticsearch是一個基於Lucene的實時的分散式搜索和分析 引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠, 快 ...
  • 一,首先想到: 1,關鍵字distinct 2,group by 3,MAX,MIN這樣的函數被稱為聚集函數,和GROUP搭配起來用 但均無法實現,執行結果如下 舉例: 表名:OffsiteOutreachTeam_List 欄位:CORPADDLEVEL(獲取該欄位不重覆數據),CHANNELCO ...
  • 一 新的可視化工具 因為前文所提到的,看不到外部伺服器和外部表的問題,我更換了可視化工具。 好用的新工具PostgreSQL Maestro! 當然如此好用的工具不是免費的,如果想免費使用還請自己去找,本文不提供此類下載。 二 在.NET項目中訪問postgreSql資料庫 2.1 第三方類庫 Np ...
  • mysql備份還原 1.1 備份恢復-說明 運維工作的核心簡單概括就兩件事: 第一個:是保護公司的數據. 第二個:是讓網站能7*24小時提供服務(用戶體驗)。 1.1.1 備份簡介 1.2 mysqldump備份工具詳解 mysql原生自帶很好用的邏輯備份工具 1.2.1 mysqldump常用參數 ...
  • 進程啟動順序 Oracle Grid Infrastructure由OS初始化守護程式啟動 操作系統初始化守護進程(init)->Grid Infrastructure包裝腳本(init.ohasd)->Grid Infrastructure守護程式和進程(ohasd.bin,oraagent.bi ...
  • 概述 本篇我們將利用DMA一步一步實現SQL Server 的遷移。幫助大家理解現在的SQL Server與新版本的融合問題,同時需要我們做哪些操作來實現新版本的升級或者遷移。 SQL Server 遷移 一定要有一個準備好的計劃,我下麵列出了所有的遷移過程需要做的工作,如下列表: 步驟列表 序號 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...