这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
这篇文章主要是收集了笔者在学习今天的课程,在学习了一些秒杀系统设计与实现课程后并进行实践操作后,总结了一些注意点。
秒杀系统注意点
全局唯一id
首先,我们在创建一个表时,一般都要创建一个主键id。如果是初学的时候,我们会直接设置id为bigint,然后设置Auto_increment然后就完事了...然而这样太危险了!因为如果被别人黑掉你的某次插入数据的请求,然后看到你的数据返回id,就可以直接根据你的id来判断你的仓库中当前有多少数据了...当然,还有分布式系统的分库分表导致id唯一性不能保证等其他原因。
所以我们需要一个新的id制作法!
这个时候,我们可能会想到了UUID——字符随机,别人看了也不知道是啥,而且还保证了id唯一性,这不符合要求吗?然而也不行,因为:
- 字符串太长了,效率不高
- 是varchar类型而不是int类型,存储压力也变大
- 由于字符串不能保证id的自动增长,从而一定程度上的降低了数据库DQL执行的效率
所以在企业中很少使用UUID作为商品的全局唯一ID。
因此,我们需要一个可以自动增长、保证唯一性、int类型的id生成方法!方法有很多,实现的技术依赖也有许多种选择,如Zookeeper、ETCD、Redis等都有自己的全局唯一id生成方法。
以Redis来举例,它的id生成准则是:时间戳|增长序列号,这样就可以保证是全局唯一id。
而对于分布式系统的全局唯一id,以Zookeeper为例,可以将集群中的节点排列为有序节点群,然后先生成当前节点的序号id,然后与生成的唯一id进行二次拼接,就可以得到分布式唯一id了。