自定义全局唯一ID

业务上ID的使用率极高,在数据库中一个ID的重复次数可能达到几百万次,为减少存储空间,提升读写性能,采用如下规则生成全局唯一的ID:

  1. ID长度固定为7字节;
  2. 第1~4个字节为纪元秒数,即从“纪元”至今的相差秒数,暂定纪元为“2021-01-01T00:00:00Z”;
  3. 第5~6个字节为视频序号,每秒从1开始递增,使用redis实现;
  4. 第7个字节为保留位,默认全0,可用于区分多数据中心或其他用途;

以上规则实现的ID可使用136年,单机房每秒最多可生成65535个ID,可以根据实际业务并发情况调整ID规则。

优点:

  1. 全局唯一,支持区分数据中心,避免ID冲突;
  2. 占用空间小,可存储为long类型(8字节),相比UUID(96字节)减少91%空间;或存储为16进制字符串(42字节),相比UUID减少56%空间;
  3. 趋势递增性,可以保证ID全局趋势递增(非单调递增),可用于大多数的排序场景,并可用作数据库唯一索引,相比UUID可以极大提升索引性能;
  4. 时间属性,可通过ID反推生成时间(视频发布时间),在部分高频场景可以极大减少数据库查询;
  5. 地域属性,可通过ID反推生成时的数据中心,在部分高频场景可以极大减少数据库查询;

缺点:

  1. 强依赖redis,redis的稳定性、吞吐量都会影响ID的生成;
  2. 依赖机器时钟,时钟误差会导致生成的ID非全局顺序性(单机顺序性),所以不建议用作高并发场景下的数据库主键;
  3. 时钟回拨问题,时钟回拨会导致重复生成ID,可以通过延长redis key的有效期来继续上一次的计数;

为保证易读性,ID在数据库中均以10进制形式存储。

关于美团的Leaf算法参考:Leaf——美团点评分布式ID生成系统

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值