首页 > 架构设计 > 软件结构 > 竞拍系统设计和核心数据结构
商品表
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博客 ” ,链接:https://blog.itpub.net/70018409/viewspace-2913554/ ,如需转载,请注明出处,否则将追究法律责任。