1.有哪些?
- SnowFlake算法,雪花算法;
- Redis自增ID,incr(key);将键为key储存的数字值增1;
- 数据库自增ID;
- UUID.
1.1.SnowFlake算法是什么?
snowflake算法是Twitter开源的分页式ID生成算法,结果是一个Long长整型的ID.
Twitter 的雪花算法 产生的是一个 64位的长整型
第一位未使用,固定为0
接下来41位为毫秒级时间,41位的长度可以使用69年
然后是10位节点id,最多支持部署1024个节点,(一般是数据中心编号和机器编号组成)
最后12位是毫秒内单位的算法调用计数,(意味着每个节点每毫秒产生4096个id序号)上面4部分加起来是64比特位 = 8 字节 =Long(转换成字符串后长度最多为19
1.2.Redis递增ID
Java中的基本类型所占的字节
Oracle产生序列号的方式
思路:
复用增长计数Api,业务系统在自增长的基础上,配合其它信息组成一个唯一ID.
Redis的incr(key),api用于将key的值进行递增,并返回增长数值.
如果key不存在,则创建并赋值为0.
利用Redis的特性:单线程原子操作,自增计数Api,数据有效机所ex.
实例:
业务编码+时间+自增数值
业务编码+工号+时间+自增数值
业务编码+地区+时间+自增数值
key的命名规范:
系统名+模块+功能+key 例如:dls_pallet_bind_id
优缺点:
优点:
拓展性强,可以方便的结合业务进行处理
利用redis操作原子性的特征,可以保证在并发的时候不会重复缺点:
引入redis就意味着引入其他三方依赖
增加一侧网络开销
需要对reids服务实现高可用
高可用:
自动分片
哨兵模式
ps:集群并不能做高可用,因为redis集群中没有选举机制,所以需要采用哨兵(选举的机制)的机制配置高可用
1.3.UUID
Uuid是按照开放软件基金会(osf)制定的标准计算
用到了以太网开地址(MAC),纳米级时间,芯片id码和许多可能的数字
由以下几部分组成
当前日期和时间
时钟序列
全局唯一的ieee机器识别号(如果有网卡,从网卡获取,没有网卡以其他方式获取)
生成长度为36的字符串
优缺点:
优点:
使用简单
不依赖其他组件
不影响数据库拓展缺点:
数据库索引效率低
太过于无意义.用户不友好
长度36的字符串,空间占用大
应用集群环境,机器多的时候,重复几率大
1.4.Mysql整型自增
Mysql 整型自增索引之所以快是因为mysql 采用b+树对整型进行了加速
Mysql使用auto_increment, oracle使用sequence序列
集群环境下,不同的库,设置不同的初始值,每次自增加 100
Mysql下修改起点和步长的方式
设置起点
Set @@auto_increment_offset=1 // 设置起点为1
设置步长
Set@@auto_increment_increment=100 // 设置步长为100
查看参数
show VARIABLES like ‘auto_%’ // 查看参数
优缺点:
优点:
无需编码
性能也过得去
索引友好缺点:
大表不能做水平分表,否则插入删除易出现问题(已经存在很大数据的时候再分表,容易出现问题)
依赖前期规划,拓展麻烦
依赖mysql内部维护自增锁,高并发下插入数据影响性能
在业务操作父,子(关联表)插入时,要先父表 后子表
相对于UUID其实数据库自增表的效率稍低
特点是:互斥 排他 可重入
2.各方案对比
优点 | 缺点 | 字节 | |
---|---|---|---|
UUID | 简单,不占用宽带 | 无序,查询慢,不可读 | 32字节 |
DB自增 | 代码简单,递增 | DB单点故障,扩展性瓶颈 | 自增 |
SnowFlake算法 | 性能优,不占用宽带,趋势递增 | 依赖服务器时间 | 18 |
Redis自增ID | 无单点故障,性能优于DB,递增,拓展灵活 | 占用宽带,Redis集群维护 | 自定义 |
3.如何选择?
SnowFlake算法性能最高,其次Redis的incr高.
4.最后:国内大厂处理策略
国内有很多厂家基于snowflake算法进行了国产化,例如:
百度的uid-generator:
https://github.com/baidu/uid-generator
https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md
美团Leaf:
https://github.com/Meituan-Dianping/Leaf
https://github.com/Meituan-Dianping/Leaf/blob/master/README.md
基本是snowflake的进一步优化,解决时钟回拨问题.