分布式id生成策略

随着业务的增长,数据会越来多,单张表在超过了800万条数据时,mysql的b+树就会增加一层节点
这时查询效率就会下降。为了提升查询效率,往往我们采用分库分表,也就是一张表的数据,我们分别
放在两张表存储。这样可以提高查询效率,但也会出现其他问题,主键的生成就是一个问题,以前一张
表的时候我们可以用数据库的自增主键,简单方便。现在数据在两张表,如果还用数据库的自增主键
那么两张表都会各自维护自己的主键,就会重复。这样就达不到主键的唯一性。这时我们就不得不自己
生成唯一的数据在作为主键,也叫分布式id。
分布式id的特点:
1.全局唯一性。
2.成主键递增趋势 mysql需要维护主键有序 来提升查询效率
分布式id主要生成方式:
1.雪花算法
这种方式是基于内存的生成,主要是由正负位+时间戳+机房id+机器id+有序数字
由于有时间戳,所以就不会产生重复id,基于内存效率非常高。但是我们的计算机会出现时钟回拨现象
就是我们计算机本地有个计时器计算我们的时间,没隔一段时间就会向ntf对比时间,如果发现我自己的
时间和ntf的时间不一致,就会把ntf的时间同步过来。如果本地时间走快了,那么通过过来的时间就会
倒退,这样就会出现id重复。解决方案:在生成id是对上次生成时间做对比,如果大于上次时间才可以
生成id。
2.基于数据库自增主键
这种方式是基于数据库来实现的,在数据库中创建一张表,只用到自增主键,每次插入时,去数据库
中生成一条数据,用生成的主键作为分布式id。这种方式比较简单。但是并发量会比较低。效率低。
数据库压力大。
3.基于redis自动加1的函数
这种方式是基于redis自身提供的原子操作来实现的,这种方式也比较简单,效率也很快。但是redis
意外故障,就会容易导致id重复。
4.使用数据库表+缓存来实现
在数据库中创建一张表,主要保存自增id的最大序列号,步长,缓存数量
在使用时,可以做双缓存使用,就是取出最大的序列号,通过步长生成缓存数量的分布式id,
然后将这些id放到缓存中,用到的时候从缓存获取。这样对性能影响较小,数据库压力也比较小。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值