前二天我寫了一篇,Redis高級項目實戰(點我直達),SpringBoot整合Redis附源碼(點我直達),今天咱們來作一下Redis秒殺系統的設計。固然啦,Redis基礎知識還不過關的,先去增強下自身內功,而後在回來看這篇,Redis基礎知識(點我直達)。爲啥寫這個微信搶紅包項目呢,公司0202年08月22日,公司週年慶,搶了100多紅包🧧,O(∩_∩)O哈哈~html
在DB、Redis分別新增一條記錄mysql
請求Redis,紅包剩餘個數,大於0才能夠拆,等會0時,提示用戶,紅包已搶完redis
Redis中數據類型的String特性的原子遞減(DECR key)和減小指定值(DECRBY key decrement)算法
查詢DB便可sql
紅包流水錶數據庫
CREATE TABLE `red_packet_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `red_packet_id` bigint(11) NOT NULL DEFAULT 0 COMMENT '紅包id,採⽤ timestamp+5位隨機數', `total_amount` int(11) NOT NULL DEFAULT 0 COMMENT '紅包總⾦額,單位分', `total_packet` int(11) NOT NULL DEFAULT 0 COMMENT '紅包總個數', `remaining_amount` int(11) NOT NULL DEFAULT 0 COMMENT '剩餘紅包⾦額,單位 分', `remaining_packet` int(11) NOT NULL DEFAULT 0 COMMENT '剩餘紅包個數', `uid` int(20) NOT NULL DEFAULT 0 COMMENT '新建紅包⽤戶的⽤戶標識', `create_time` timestamp COMMENT '建立時間', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='紅包信息 表,新建⼀個紅包插⼊⼀條記錄';
紅包記錄表微信
CREATE TABLE `red_packet_record` ( `id` int(11) NOT NULL AUTO_INCREMENT, `amount` int(11) NOT NULL DEFAULT '0' COMMENT '搶到紅包的⾦額', `nick_name` varchar(32) NOT NULL DEFAULT '0' COMMENT '搶到紅包的⽤戶的⽤戶 名', `img_url` varchar(255) NOT NULL DEFAULT '0' COMMENT '搶到紅包的⽤戶的頭像', `uid` int(20) NOT NULL DEFAULT '0' COMMENT '搶到紅包⽤戶的⽤戶標識', `red_packet_id` bigint(11) NOT NULL DEFAULT '0' COMMENT '紅包id,採⽤ timestamp+5位隨機數', `create_time` timestamp COMMENT '建立時間', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='搶紅包記 錄表,搶⼀個紅包插⼊⼀條記錄';
注意,往db中就單純存入一條記錄,Service層和Mapper層,就簡單的一條sql語句,主要是提供思路,下面會附案例源碼,不要慌併發
經過上圖算法得出,靠前面的人,手氣最佳概率小,手氣最佳,每每在後面app
由於我發了10個紅包,金額是20000,使用壓測工具,模擬50個請求,只容許前10個請求能搶到紅包,而且金額等於20000。高併發
連接: https://pan.baidu.com/s/1knmVMKBldVe46cmXqqfGpw 密碼: a7o7
微信上有個小夥伴恰好要作一個秒殺的系統,催我趕忙把博客更新出來。過2天繼續往下更新,布隆過濾器。