赞
踩
上一篇文章,我们聊了一下分库分表相关的一些基础知识,具体可以参见:《用真实业务场景告诉你,高并发下如何设计数据库架构?》。
这篇文章,我们就接着分库分表的知识,来具体聊一下全局唯一id如何生成。
在分库分表之后你必然要面对的一个问题,就是id咋生成?
因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那肯定不对啊。
举个例子,你的订单表拆分为了1024张订单表,每个表的id都从1开始累加,这个肯定有问题了!
你的系统就没办法根据表主键来查询订单了,比如id = 50这个订单,在每个表里都有!
所以此时就需要分布式架构下的全局唯一id生成的方案了,在分库分表之后,对于插入数据库中的核心id,不能直接简单使用表自增id,要全局生成唯一id,然后插入各个表中,保证每个表内的某个id,全局唯一。
比如说订单表虽然拆分为了1024张表,但是id = 50这个订单,只会存在于一个表里。
那么如何实现全局唯一id呢?有以下几种方案。
这个方案就是说你的系统每次要生成一个id,都是往一个独立库的一个独立表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个id。拿到这个id之后再往对应的分库分表里去写入。
比如说你有一个auto_id库,里面就一个表,叫做auto_id表,有一个id是自增长的。
那么你每次要获取一个全局唯一id,直接往这个表里插入一条记录,获取一个全局唯一id即可,然后这个全局唯一id就可以插入订单的分库分表中。
这个方案的好处就是方便简单,谁都会用。缺点就是单库生成自增id,要是高并发的话,就会有瓶颈的,因为auto_id库要是承载个每秒几万并发,肯定是不现实的了。
这个每个人都应该知道吧,就是用UUID生成一个全局唯一的id。
好处就是每个系统本地生成,不要基于数据库来了
不好之处就是,uuid太长了,作为主键性能太差了,不适合用于主键。
如果你是要随机生成个什么文件名了,编号之类的,你可以用uuid,但是作为主键是不能用uuid的。
这个方案的意思就是获取当前时间作为全局唯一的id。
但是问题是,并发很高的时候,比如一秒并发几千,会有重复的情况,这个是肯定不合适的。
一般如果用这个方案,是将当前时间跟很多其他的业务字段拼接起来ÿ
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。