欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

生成唯一id的几种方法

程序员文章站 2024-01-06 21:12:05
生成唯一id的几种方法生成唯一id的方式有很多,UUID,自动增长列,雪花算法,redis等等。生成id的要求:全局唯一趋势递增效率高(生成.使用.索引)控制并发1.雪花算法(twitter 的 snowflake算法)Snowfake算法是twitter’开源的分布式id生成算法,结果就是long长整型的id雪花算法又名(SnowFlake)生成id的结果是一个64bit大小的整数。函数图如下:雪花算法保证:所有生成的id按时间趋势递增整个分布式系统内不会产生重复id(因为有...

生成唯一id的几种方法

生成唯一id的方式有很多,UUID,自动增长列,雪花算法,redis等等。

生成id的要求:

全局唯一
趋势递增
效率高(生成.使用.索引)
控制并发

1.雪花算法(twitter 的 snowflake算法)

Snowfake算法是twitter’开源的分布式id生成算法,结果就是long长整型的id

雪花算法又名(SnowFlake)生成id的结果是一个64bit大小的整数。函数图如下:

生成唯一id的几种方法

雪花算法保证:

  1. 所有生成的id按时间趋势递增
  2. 整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)

2.UUID

简介:Uuid是按照开放软件基金会(osf)制定的标准计算
用到了以太网开地址(MAC),纳米级时间,芯片id码和许多可能的数字

组成:

1.当前日期和时间
2.时钟序列
3.全局唯一的ieee机器识别号(如果有网卡,从网卡获取,没有网卡以其他方式获取)
生成长度为36的字符串

优点:
使用简单
不依赖其他组件
不影响数据库拓展
缺点:
数据库索引效率低
太过于无意义.用户不友好
长度36的字符串,空间占用大
应用集群环境,机器多的时候,重复几率大

UUID的一个缺点就是生成的字符串过长。

3.自动增长

mysql自带自增生成id,oracle可以用序列生成id,但在数据库集群环境下,扩展性不好。

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内部维护自增锁,高并发下插入数据影响性能
在业务操作父,子(关联表)插入时,要先父表 后子表

4.Redis

Java 中 基本类型所占的字节
Oracle 产生序列号的方式

思路:

利用增长计数api,业务系统在自增长的基础上,配合其他信息组成一个唯一id
Redis的incr(key) api用于将key的值进行递增,并返回增长数值
如果key不存在,则创建并赋值为0
利用redis的特性: 单线程原子操作,自增计数api,数据有效机制ex

实例:业务编码+地区+自增数值

key的命名规范:系统名:+ 模块:+ 功能: + key 例如: 163:study:order:id

优点:
拓展性强,可以方便的结合业务进行处理
利用redis操作原子性的特征,可以保证在并发的时候不会重复
缺点:
引入redis就意味着引入其他三方依赖
增加一侧网络开销
需要对reids服务实现高可用

生成唯一id的几种方法

本文地址:https://blog.csdn.net/Clsrm/article/details/110638093

相关标签: java

上一篇:

下一篇: