业务上ID的使用率极高,在数据库中一个ID的重复次数可能达到几百万次,为减少存储空间,提升读写性能,采用如下规则生成全局唯一的ID:
- ID长度固定为7字节;
- 第1~4个字节为纪元秒数,即从“纪元”至今的相差秒数,暂定纪元为“2021-01-01T00:00:00Z”;
- 第5~6个字节为视频序号,每秒从1开始递增,使用redis实现;
- 第7个字节为保留位,默认全0,可用于区分多数据中心或其他用途;
以上规则实现的ID可使用136年,单机房每秒最多可生成65535个ID,可以根据实际业务并发情况调整ID规则。
优点:
- 全局唯一,支持区分数据中心,避免ID冲突;
- 占用空间小,可存储为long类型(8字节),相比UUID(96字节)减少91%空间;或存储为16进制字符串(42字节),相比UUID减少56%空间;
- 趋势递增性,可以保证ID全局趋势递增(非单调递增),可用于大多数的排序场景,并可用作数据库唯一索引,相比UUID可以极大提升索引性能;
- 时间属性,可通过ID反推生成时间(视频发布时间),在部分高频场景可以极大减少数据库查询;
- 地域属性,可通过ID反推生成时的数据中心,在部分高频场景可以极大减少数据库查询;
缺点:
- 强依赖redis,redis的稳定性、吞吐量都会影响ID的生成;
- 依赖机器时钟,时钟误差会导致生成的ID非全局顺序性(单机顺序性),所以不建议用作高并发场景下的数据库主键;
- 时钟回拨问题,时钟回拨会导致重复生成ID,可以通过延长redis key的有效期来继续上一次的计数;
为保证易读性,ID在数据库中均以10进制形式存储。
关于美团的Leaf算法参考:Leaf——美团点评分布式ID生成系统