最近在搞分表,只好弄全局唯一ID,是专门搞个自增ID还是弄GUID?
自增ID是数字,自增系统 出现问题 就蛋疼了, GUID字符串生成的每次都不一样,但是很长。
大家用哪个?
最近在搞分表,只好弄全局唯一ID,是专门搞个自增ID还是弄GUID?
自增ID是数字,自增系统 出现问题 就蛋疼了, GUID字符串生成的每次都不一样,但是很长。
大家用哪个?
其实你就是希望拿到一个唯一值,然后根据这个唯一进行规则判断,然后写入到一个表中去。你看一下你需要插入的记录,存不存在唯一值,这个唯一值是否需要对应业务。只是需要一个唯一值,简单写法就是根据时间戳加随机数,然后取余数,写入表中
发号器
如果想要全局唯一递增ID,通过ZooKeeper的PERSISTENT_SEQUENTIAL类型节点获取递增。通过取模分表
不能插入之前查重。既然分表就意味着高并发。查的时候没重复,不意味着插的时候不重复。然后ZooKeeper嘛,分布式应用你不用ZooKeeper,逗我玩?
如果是UUID,则发号器干几件事情:
1、预生成一堆UUID,丢到队列里。
2、需要用号,从队列取一个号,并添加到布隆过滤器里。
3、守护线程发现队列里预备号太少,则再生成一堆新的预备号,通过布隆过滤器校验后,丢到队列里。
解决了UUID生成慢和可能撞车的问题。
通过UUID后X位分表。X根据业务规模定,规模越大X越大,表分得越细。
也可以根据其他业务规则分表,例如用户的订单表,则可以根据用户的ID分表。这样同一个用户的订单会存在同一张表里,避免查的时候跨表。
15 回答8.4k 阅读
8 回答6.2k 阅读
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
可以用 Twitter 的
snowflake
这里有个解释
twitter-snowflake,64位自增id算法详解
不同的语言也都有实现,可以自行搜索一下。