競拍系統設計和核心資料結構
技術:php、mysql、redis、laravel
業務物件:商品、場次、訂單
競拍過程:
商品表
CREATE TABLE `goods` ( `id` int(12) unsigned NOT NULL AUTO_INCREMENT COMMENT 'pk', `num` varchar(64) NOT NULL COMMENT '商品編號', `users_id` int(12) unsigned NOT NULL COMMENT '擁有者', `create_users_id` int(12) unsigned NOT NULL COMMENT '商品建立人', `contract_roles_id` int(10) unsigned NOT NULL COMMENT '商品合約級別外來鍵', `name` varchar(255) NOT NULL COMMENT '商品名稱', `img` int(11) NOT NULL COMMENT '封面圖', `price` decimal(10,2) unsigned NOT NULL COMMENT '當前價格', `area_id` int(11) NOT NULL COMMENT '區域id', `trade_num` int(11) unsigned NOT NULL COMMENT '交易次數', `user_name` varchar(100) DEFAULT NULL COMMENT '收貨人名稱', `user_phone` varchar(11) DEFAULT NULL COMMENT '收貨人聯絡電話', `user_address` varchar(255) DEFAULT NULL COMMENT '收貨人地址', `express_id` int(11) DEFAULT NULL COMMENT '物流ID', `express_no` varchar(255) DEFAULT NULL COMMENT '物流單號', `is_auction` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否可競拍,1=》可 2=》不可', `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '狀態1=>可交易 2=>待支付 3=>交易完成 4=>待發貨 5=》配送中 6=>完成 7 =>待收款', `next_time` timestamp NULL DEFAULT NULL COMMENT '下次最早顯示時間', `trade_time` timestamp NULL DEFAULT NULL COMMENT '下次可交易時間', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新時間', `deleted_at` timestamp NULL DEFAULT NULL COMMENT '刪除時間', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
競拍場次表
CREATE TABLE `auctions` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID', `area` tinyint(4) NOT NULL COMMENT '拍賣區域,1=>新手區,2=>競拍區,3=>星級區', `name` varchar(64) DEFAULT NULL COMMENT '場次名稱', `start` time NOT NULL COMMENT '開始時間', `end` time NOT NULL COMMENT '結束時間', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新時間', `deleted_at` timestamp NULL DEFAULT NULL COMMENT '刪除時間', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='拍賣場次表';
訂單表
CREATE TABLE `orders` ( `id` int(12) unsigned NOT NULL AUTO_INCREMENT COMMENT 'pk', `serial_num` varchar(32) DEFAULT NULL COMMENT '流水號,沒交易前為空', `goods_id` int(12) unsigned NOT NULL COMMENT '商品id', `sell_users_id` int(12) unsigned NOT NULL COMMENT '競拍商品擁有者id', `buy_users_id` int(12) unsigned DEFAULT NULL COMMENT '購買商品使用者id', `buy_price` decimal(10,2) NOT NULL COMMENT '購買價格-成本價格', `pay_time` datetime DEFAULT NULL COMMENT '支付時間', `status` char(5) NOT NULL COMMENT '狀態10000=>待支付 20000=>支付超時 30000=>確認支付 30001=>確認收款 40000=>賣家申訴中 40001=>買家申訴中 45000=>申訴完成 50000=>完成', `contract_roles_id` int(10) NOT NULL COMMENT '購買時商品合約外來鍵', `charge_rate` decimal(10,4) unsigned DEFAULT NULL COMMENT '手續費', `remark` varchar(255) DEFAULT NULL COMMENT '備註-可以填寫申訴結果', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `updated_at` timestamp NULL DEFAULT NULL COMMENT '更新時間', `deleted_at` timestamp NULL DEFAULT NULL COMMENT '刪除時間', PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
1、競拍場次時間是為每天固定的三個時間,定時提前寫入並設定過期時間。
-
key: prefix + area_id + start + end + auctions_id,value:uid
-
key: prefix + area_id + start + end + auctions_id,score:goods_id,member:goods_detail
-
key: randomvalue:1
-
key: prefix + area_id + start + endvalue:1
key: prefix + area_id +users_id + auction_id+ start + end,score:goods_id,member:goods_id
key: prefix + area_id + auction_id + goods_id + start + end,value:goods
key: randomvalue:1
key: prefix + area_id + start + end value:1
三、配置Redis持久化
持久化兩種模式都開啟:RDB(快照模式)+ AOF(日誌模式)
配置檔案:save/append_only
區別:兩者資料儲存間隔週期不同,RDB儲存間隔大於AOF儲存間隔
四、實現秒殺下單邏輯
五、秒殺過程redis最佳化
因快取資料結構的設計,可能會在redis儲存大量的key,若透過keys命令查詢會是O(n)複雜度,查詢會卡頓而緩慢,redis有提供scan迭代來代替keys,但是根據本專案無需使用它。
最佳化大致有兩個方面:
1、在提前將競拍資訊寫入redis時,因key數量大,可採用redis的pipeline管道來提高寫入效率
2、儘可能將場次和開始結束時間返回前端讓其在查詢或競拍時傳給後端,後端拼接key值獲取資料的時間複雜度是O(1)。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70018409/viewspace-2913554/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料庫:系統設計的核心資料庫
- 【web】資料庫應用系統設計體系結構Web資料庫
- 基於Java+SpringBoot+Mysql線上簡單拍賣競價拍賣競拍系統功能設計與實現三JavaSpring BootMySql
- 基於Java+SpringBoot+Mysql線上簡單拍賣競價拍賣競拍系統功能設計與實現十一JavaSpring BootMySql
- 【系統設計】系統設計中經常使用的20個高階資料結構和演算法資料結構演算法
- 圖資料庫 Nebula Graph 的資料模型和系統架構設計資料庫模型架構
- 作業系統核心結構作業系統
- PDM系統的結構設計
- Hadoop高階資料分析 使用Hadoop生態系統設計和構建大資料系統Hadoop大資料
- 讀資料工程之道:設計和構建健壯的資料系統14源系統
- 資料結構 課程設計 員工管理系統(C語言)資料結構C語言
- 資料結構而非演算法是程式設計的核心 - theartofmachinery資料結構演算法程式設計Mac
- 讀資料工程之道:設計和構建健壯的資料系統18資料儲存系統(上)
- 讀資料工程之道:設計和構建健壯的資料系統19資料儲存系統 (下)
- 太原ATC系統計劃資料結構明細資料結構
- [資料庫系統]儲存和檔案結構資料庫
- 讀資料工程之道:設計和構建健壯的資料系統05底層設計(上)
- 讀資料工程之道:設計和構建健壯的資料系統06底層設計(下)
- HBase 系統架構及資料結構架構資料結構
- 讀資料工程之道:設計和構建健壯的資料系統26資料建模
- 系統架構設計筆記(97)—— 資料包架構筆記
- 讀資料工程之道:設計和構建健壯的資料系統08主要架構概念架構
- 競拍秒購電商系統開發需求和功能架構分析架構
- FunData — 電競大資料系統架構演進大資料架構
- 剖析JS和Redis的資料結構設計:陣列JSRedis資料結構陣列
- 讀資料工程之道:設計和構建健壯的資料系統07資料架構的原則架構
- LevelDB系統結構與設計思路分析
- EasyUI+JavaWeb獎助學金管理系統[3]-資料庫結構設計UIJavaWeb資料庫
- 程式設計體系結構(09):分散式系統架構程式設計分散式架構
- 讀資料工程之道:設計和構建健壯的資料系統02資料工程師工程師
- 讀資料工程之道:設計和構建健壯的資料系統01資料工程概述
- 讀資料工程之道:設計和構建健壯的資料系統21資料獲取
- 讀資料工程之道:設計和構建健壯的資料系統31安全和隱私
- 讀資料工程之道:設計和構建健壯的資料系統09示例和型別型別
- 工作小結和聊天系統設計
- CRM系統:助力資料服務企業,打造核心競爭力
- 讀資料工程之道:設計和構建健壯的資料系統27轉換
- 讀資料工程之道:設計和構建健壯的資料系統25查詢