点击上方蓝色“鲸鱼手记”,关注并选择“设为星标”。
作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写出来与大家一起交流,也希望采用这种方式记录自己的学习之旅。
目录
1.有哪些?1.1.SnowFlake算法是什么?1.2.Redis递增ID思路:实例:key的命名规范:优缺点:高可用:1.3.UUID由以下几部分组成优缺点:1.4.Mysql整型自增优缺点:2.各方案对比3.如何选择?4.最后:国内大厂处理策略
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,数据有效机制.
实例:
业务编码+时间+自增数值
业务编码+工号+时间+自增数值
业务编码+地区+时间+自增数值
key的命名规范:
系统名+模块+功能+key 例如:dlspalletbind_id
优缺点:
优点: 拓展性强,可以方便的结合业务进行处理 利用redis操作原子性的特征,可以保证在并发的时候不会重复
缺点: 引入redis就意味着引入其他三方依赖 增加一侧网络开销 需要对reids服务实现高可用
高可用:
自动分片
哨兵模式
ps:集群并不能做高可用,因为redis集群中没有选举机制,所以需要采用哨兵(选举的机制)的机制配置高可用
1.3.UUID
Uuid是按照开放软件基金会(osf)制定的标准计算 用到了以太网开地址(MAC),纳米级时间,芯片id码和许多可能的数字
由以下几部分组成
当前日期和时间 时钟序列 全局唯一的ieee机器识别号(如果有网卡,从网卡获取,没有网卡以其他方式获取) 生成长度为36的字符串
优缺点:
优点: 使用简单 不依赖其他组件 不影响数据库拓展
缺点: 数据库索引效率低 太过于无意义.用户不友好 长度36的字符串,空间占用大 应用集群环境,机器多的时候,重复几率大
1.4.Mysql整型自增
Mysql 整型自增索引之所以快是因为mysql 采用b+树对整型进行了加速 Mysql使用autoincrement, oracle使用sequence序列 集群环境下,不同的库,设置不同的初始值,每次自增加 100 Mysql下修改起点和步长的方式 设置起点 Set @@autoincrementoffset=1 设置起点为1 设置步长 Set@@autoincrementincrement=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的进一步优化,解决时钟回拨问题.




