分布式ID解决方案
可供选择的分布式ID方案
UUID
优点:
- 简单,代码方便
- 生成ID性能非常好,基本不会有性能问题
- 全球唯一,永不重复
缺点:
- 没有排序,无法保证趋势递增
- UUID存的是字符串,查询效率比较低
- UUID 存储空间以及数据传输数据量大基于数据库的自增ID
基于 Redis 的自增ID
使用Redis的原子操作 INCR和INCRBY来实现
比较适合使用Redis来生成每天从0开始的流水号。比如订单号=日期+自增长号
优点:
- 不依赖于数据库,灵活方便,且性能优于数据库
- 数字ID天然排序,对分页或者排序的结果有帮助基于MongoDB的ObjectId
Snowflake
twitter 开发的一套全局唯一ID生成服务 Snowflake- 41位的时间序列(精确到毫秒,41位的长度可以使用69年)
- 10位的机器标识(10为的长度最多支持1024个节点部署)
- 12位的计数序号
类snowflake算法
本人比较偏向于基于Redis的方式生成自增ID。现在的项目基本都会引入Reids做缓存中间件,因此不会因为额外的组件。生产环境中的Reids,基本上都基于主从,或者集群可以防止单点故障。
同时代码实现也比较简单。比如ID = YYYYMMDD + 自增长号。后台使用两个字段值来作为ID,排序时先根据时间,再根据自增长ID进行排序。