# 《Seckill秒杀系统》第74章:预约系统分库分表编码实现

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本章难度:★★☆☆☆
  • 本章重点:对预约系统中的商品预约配置信息,用户预约商品的记录信息进行分库分表实现,重点理解分库分表的设计思想和落地实现,并能够将其灵活应用到实际项目中。

大家好,我是冰河~~

虽然预约系统的流量在大部分情况下比秒杀系统的流量小,但是如果在某一时刻,有大量用户预约秒杀商品,则预约系统可能会出现类似秒杀的场景,具备秒杀系统的某些特点。所以,对预约系统中存在高并发读写的数据,我们做了分库分表的设计。

# 一、前言

像秒杀这种高并发、大流量的场景,交易链路相对来说也比较复杂,但是交易链路上比较重要的服务和系统,哪怕流量再搞,也是不能出现宕机的,否则,会给平台带来巨大的损失。所以,对于交易链路上的核心服务和核心系统而言,一定要进行深度优化。

# 二、本章诉求

对预约系统中的商品预约配置数据和用户预约秒杀商品的数据进行分库分表的实现,将单个数据库和单张数据表的读写压力,按照一定的规则分摊到多个数据库下的多张数据表中。以此来进一步提升预约系统中数据的读写性能。

创建分库分表之后的数据库,并且使用ShardingSphere实现数据的分库分表操作。

# 三、创建分库分表数据库

在MySQL中创建seckill_reservation_0、seckill_reservation_1和seckill_reservation_2数据库,并且在每个数据库中执行如下SQL语句创建对应的数据表。

-- ----------------------------
-- Table structure for seckill_reservation_config_0
-- ----------------------------
DROP TABLE IF EXISTS `seckill_reservation_config_0`;
CREATE TABLE `seckill_reservation_config_0`  (
  `id` bigint(20) NOT NULL COMMENT '数据主键',
  `goods_id` bigint(20) NULL DEFAULT 0 COMMENT '商品id',
  `goods_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '商品名称',
  `reserve_max_user_count` int(11) NULL DEFAULT 0 COMMENT '预约人数上限,不做严格限制',
  `reserve_current_user_count` int(11) NULL DEFAULT 0 COMMENT '当前预约人数,实际可比预约人数上限大,也可比其小,在一定范围内即可',
  `reserve_start_time` datetime(0) NULL DEFAULT NULL COMMENT '预约开始时间',
  `reserve_end_time` datetime(0) NULL DEFAULT NULL COMMENT '预约结束时间',
  `seckill_start_time` datetime(0) NULL DEFAULT NULL COMMENT '秒杀开始时间',
  `seckill_end_time` datetime(0) NULL DEFAULT NULL COMMENT '秒杀结束时间',
  `status` int(2) NULL DEFAULT 1 COMMENT '状态,0:已发布,1:上线;-1:下线',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `goods_id_index`(`goods_id`) USING BTREE COMMENT '一个秒杀商品存在一条预约规则信息'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '针对商品配置的预约配置表';

-- ----------------------------
-- Table structure for seckill_reservation_config_1
-- ----------------------------
DROP TABLE IF EXISTS `seckill_reservation_config_1`;
CREATE TABLE `seckill_reservation_config_1`  (
  `id` bigint(20) NOT NULL COMMENT '数据主键',
  `goods_id` bigint(20) NULL DEFAULT 0 COMMENT '商品id',
  `goods_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '商品名称',
  `reserve_max_user_count` int(11) NULL DEFAULT 0 COMMENT '预约人数上限,不做严格限制',
  `reserve_current_user_count` int(11) NULL DEFAULT 0 COMMENT '当前预约人数,实际可比预约人数上限大,也可比其小,在一定范围内即可',
  `reserve_start_time` datetime(0) NULL DEFAULT NULL COMMENT '预约开始时间',
  `reserve_end_time` datetime(0) NULL DEFAULT NULL COMMENT '预约结束时间',
  `seckill_start_time` datetime(0) NULL DEFAULT NULL COMMENT '秒杀开始时间',
  `seckill_end_time` datetime(0) NULL DEFAULT NULL COMMENT '秒杀结束时间',
  `status` int(2) NULL DEFAULT 1 COMMENT '状态,0:已发布,1:上线;-1:下线',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `goods_id_index`(`goods_id`) USING BTREE COMMENT '一个秒杀商品存在一条预约规则信息'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '针对商品配置的预约配置表';

-- ----------------------------
-- Table structure for seckill_reservation_config_2
-- ----------------------------
DROP TABLE IF EXISTS `seckill_reservation_config_2`;
CREATE TABLE `seckill_reservation_config_2`  (
  `id` bigint(20) NOT NULL COMMENT '数据主键',
  `goods_id` bigint(20) NULL DEFAULT 0 COMMENT '商品id',
  `goods_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '商品名称',
  `reserve_max_user_count` int(11) NULL DEFAULT 0 COMMENT '预约人数上限,不做严格限制',
  `reserve_current_user_count` int(11) NULL DEFAULT 0 COMMENT '当前预约人数,实际可比预约人数上限大,也可比其小,在一定范围内即可',
  `reserve_start_time` datetime(0) NULL DEFAULT NULL COMMENT '预约开始时间',
  `reserve_end_time` datetime(0) NULL DEFAULT NULL COMMENT '预约结束时间',
  `seckill_start_time` datetime(0) NULL DEFAULT NULL COMMENT '秒杀开始时间',
  `seckill_end_time` datetime(0) NULL DEFAULT NULL COMMENT '秒杀结束时间',
  `status` int(2) NULL DEFAULT 1 COMMENT '状态,0:已发布,1:上线;-1:下线',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `goods_id_index`(`goods_id`) USING BTREE COMMENT '一个秒杀商品存在一条预约规则信息'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '针对商品配置的预约配置表';

-- ----------------------------
-- Table structure for seckill_reservation_goods_0
-- ----------------------------
DROP TABLE IF EXISTS `seckill_reservation_goods_0`;
CREATE TABLE `seckill_reservation_goods_0`  (
  `id` bigint(20) NOT NULL COMMENT '数据主键',
  `reserve_config_id` bigint(20) NULL DEFAULT 0 COMMENT '预约配置id',
  `goods_id` bigint(20) NULL DEFAULT 0 COMMENT '商品id',
  `goods_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '商品名称',
  `user_id` bigint(20) NULL DEFAULT 0 COMMENT '用户id',
  `reserve_time` datetime(0) NULL DEFAULT NULL COMMENT '预约时间',
  `status` int(2) NULL DEFAULT 1 COMMENT '状态,1:正常;0:删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `user_id_index`(`user_id`) USING BTREE COMMENT '用户id索引',
  INDEX `goods_id_index`(`goods_id`) USING BTREE COMMENT '商品id索引'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品维度预约商品的记录表';

-- ----------------------------
-- Table structure for seckill_reservation_goods_1
-- ----------------------------
DROP TABLE IF EXISTS `seckill_reservation_goods_1`;
CREATE TABLE `seckill_reservation_goods_1`  (
  `id` bigint(20) NOT NULL COMMENT '数据主键',
  `reserve_config_id` bigint(20) NULL DEFAULT 0 COMMENT '预约配置id',
  `goods_id` bigint(20) NULL DEFAULT 0 COMMENT '商品id',
  `goods_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '商品名称',
  `user_id` bigint(20) NULL DEFAULT 0 COMMENT '用户id',
  `reserve_time` datetime(0) NULL DEFAULT NULL COMMENT '预约时间',
  `status` int(2) NULL DEFAULT 1 COMMENT '状态,1:正常;0:删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `user_id_index`(`user_id`) USING BTREE COMMENT '用户id索引',
  INDEX `goods_id_index`(`goods_id`) USING BTREE COMMENT '商品id索引'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品维度预约商品的记录表';

-- ----------------------------
-- Table structure for seckill_reservation_goods_2
-- ----------------------------
DROP TABLE IF EXISTS `seckill_reservation_goods_2`;
CREATE TABLE `seckill_reservation_goods_2`  (
  `id` bigint(20) NOT NULL COMMENT '数据主键',
  `reserve_config_id` bigint(20) NULL DEFAULT 0 COMMENT '预约配置id',
  `goods_id` bigint(20) NULL DEFAULT 0 COMMENT '商品id',
  `goods_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '商品名称',
  `user_id` bigint(20) NULL DEFAULT 0 COMMENT '用户id',
  `reserve_time` datetime(0) NULL DEFAULT NULL COMMENT '预约时间',
  `status` int(2) NULL DEFAULT 1 COMMENT '状态,1:正常;0:删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `user_id_index`(`user_id`) USING BTREE COMMENT '用户id索引',
  INDEX `goods_id_index`(`goods_id`) USING BTREE COMMENT '商品id索引'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '商品维度预约商品的记录表';

-- ----------------------------
-- Table structure for seckill_reservation_user_0
-- ----------------------------
DROP TABLE IF EXISTS `seckill_reservation_user_0`;
CREATE TABLE `seckill_reservation_user_0`  (
  `id` bigint(20) NOT NULL COMMENT '数据主键',
  `reserve_config_id` bigint(20) NULL DEFAULT 0 COMMENT '预约配置id',
  `goods_id` bigint(20) NULL DEFAULT 0 COMMENT '商品id',
  `goods_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '商品名称',
  `user_id` bigint(20) NULL DEFAULT 0 COMMENT '用户id',
  `reserve_time` datetime(0) NULL DEFAULT NULL COMMENT '预约时间',
  `status` int(2) NULL DEFAULT 1 COMMENT '状态,1:正常;0:删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `user_id_index`(`user_id`) USING BTREE COMMENT '用户id索引',
  INDEX `goods_id_index`(`goods_id`) USING BTREE COMMENT '商品id索引'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户维度预约商品的记录表';

-- ----------------------------
-- Table structure for seckill_reservation_user_1
-- ----------------------------
DROP TABLE IF EXISTS `seckill_reservation_user_1`;
CREATE TABLE `seckill_reservation_user_1`  (
  `id` bigint(20) NOT NULL COMMENT '数据主键',
  `reserve_config_id` bigint(20) NULL DEFAULT 0 COMMENT '预约配置id',
  `goods_id` bigint(20) NULL DEFAULT 0 COMMENT '商品id',
  `goods_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '商品名称',
  `user_id` bigint(20) NULL DEFAULT 0 COMMENT '用户id',
  `reserve_time` datetime(0) NULL DEFAULT NULL COMMENT '预约时间',
  `status` int(2) NULL DEFAULT 1 COMMENT '状态,1:正常;0:删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `user_id_index`(`user_id`) USING BTREE COMMENT '用户id索引',
  INDEX `goods_id_index`(`goods_id`) USING BTREE COMMENT '商品id索引'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户维度预约商品的记录表';

-- ----------------------------
-- Table structure for seckill_reservation_user_2
-- ----------------------------
DROP TABLE IF EXISTS `seckill_reservation_user_2`;
CREATE TABLE `seckill_reservation_user_2`  (
  `id` bigint(20) NOT NULL COMMENT '数据主键',
  `reserve_config_id` bigint(20) NULL DEFAULT 0 COMMENT '预约配置id',
  `goods_id` bigint(20) NULL DEFAULT 0 COMMENT '商品id',
  `goods_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '商品名称',
  `user_id` bigint(20) NULL DEFAULT 0 COMMENT '用户id',
  `reserve_time` datetime(0) NULL DEFAULT NULL COMMENT '预约时间',
  `status` int(2) NULL DEFAULT 1 COMMENT '状态,1:正常;0:删除',
  PRIMARY KEY (`id`) USING BTREE,
  INDEX `user_id_index`(`user_id`) USING BTREE COMMENT '用户id索引',
  INDEX `goods_id_index`(`goods_id`) USING BTREE COMMENT '商品id索引'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户维度预约商品的记录表';
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158

至此,分库分表后的数据库创建完毕。

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码