生成唯一id的几种方法

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

生成id的要求:

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

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

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

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

雪花算法保证:

  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的几种方法相关推荐

  1. php给留言分配id_如何使用php生成唯一ID的4种方法

    php生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID.由于生成唯一ID与微秒时间关联,因此ID的唯一性非常 ...

  2. java唯一id_生成唯一ID的四种办法 程序员必备

    我们在实际编程过程中会经常遇到需要用唯一ID的场合,这些唯一ID还会存到数据库中以便于我们将来进行查询. 例如用户编号.订单编号.客户编号等等,几乎凡是需要用来严格划分用户数据归属性的地方就需要用到唯 ...

  3. JavaScript 生成唯一ID的几种方式

    这篇文章主要介绍了JavaScript 生成唯一ID的几种方式,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下. 编程的世界里,在很多的时候,我们都需要一个唯一的ID来代表一些数 ...

  4. Java生成唯一id的几种方式(已验证)

    1.数据库自增序列方式 数据库方式比较简单,比如oracle可以用序列生成id,Mysql中的AUTO_INCREMENT等,这样可以生成唯一的ID,性能和稳定性依赖于数据库!如mysql主键递增: ...

  5. 游戏服务器生成全局唯一ID的几种方法

    在服务器系统开发时,为了适应数据大并发的请求,我们往往需要对数据进行异步存储,特别是在做分布式系统时,这个时候就不能等待插入数据库返回了取自动id了,而是需要在插入数据库之前生成一个全局的唯一id,使 ...

  6. 高并发分布式下生成全局ID的几种方法

    文章目录 利用全球唯一UUID生成订单号码 基于数据库实现全局ID 基于redis生成全局ID策略 号段模式 雪花算法 利用全球唯一UUID生成订单号码 **推荐理由: 简单方便,网上虽然说UUID出 ...

  7. java 生成objectid_【Java】唯一ID的几种生成方案

    在互联网的业务系统中,涉及到各种各样的ID,订单id,支付id,退款id,下面我一一来列举一下,不一定全部适合,这些解决方案仅供你参考,或许对你有用. 方案: 1.UUID 算法的核心思想是结合机器的 ...

  8. 生成唯一字符串算法_面试官问:在分布式场景,生成唯一ID,你有几种方案?...

    来源:http://t.cn/RG0AW0a 说明:本文代码采用C#,重要的是理解解决方案,代码实现都是次要的. 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成I ...

  9. 全局唯一递增的id_生成全局唯一id的几种方式

    生成全局唯一id的几种方式: 1.uuid生成全球唯一id,生成方式简单粗暴,本地生成,没有网络开销,效率高:缺点长度较长,没有递增趋势性,不易维护,常用于生成token令牌. 2.mysql自带自增 ...

最新文章

  1. STM8L探索套件学习笔记(转)
  2. 对网站的代码采集实例
  3. 到底什么是P问题,NP问题,NPC问题,NP-hard问题?什么是规约(或约化)?
  4. 如何在win下使用linux命令
  5. 放弃 802.11 命名方式,Wi-Fi 6 标准公布,速度快 37%
  6. ubuntu 12.04 3D特效
  7. 23种设计模式之适配器模式代码实例
  8. 拓端tecdat|R语言用ARIMA模型,ARIMAX模型预测冰淇淋消费时间序列数据
  9. 页面刷新_刷新vue页面,解决数据丢失
  10. ds哈希查找--链地址法_Hash冲突之开放地址法
  11. 后期强ps画意大师完美破解版一键打造中国风
  12. ubuntu 18.04 + SVO2.0
  13. scrapy爬虫框架实现简单案例:爬取阳光平台内容
  14. 你在加密市场能走多远 取决于你的思维认知
  15. 百度权重怎么查询?哪里可以查询百度权重?
  16. 古玩文物字画寄售系统源码
  17. 面试:“RPC 好,还是 RESTful 好?” 不要选错了!
  18. 用python3画爱心树_小班绘画爱心树教案
  19. C# 代码反编译、代码混淆与加壳工具
  20. 垃圾分类 小程序完整项目!

热门文章

  1. 电子邮件全自动加密和数字签名解决方案
  2. 常州SEO姜东:搜索引擎的工作原理抓取、索引和排名-搜索引擎如何工作
  3. python中间值怎么获得_使用python 3的中间值
  4. UVA 10474 Where is the Marble
  5. 生物到计算机跨考408------我独特的经验
  6. java-php-python-ssm校园闲置物品交易系统计算机毕业设计
  7. 打造自己的弱口令扫描工具
  8. 小程序`uin-app`之列表循环
  9. jmap的用法:Java 内存映像工具 jmap -heap pid
  10. 非技术性的面试中的技巧性回答集锦(建议收藏)