高并发下如何生成唯一ID

通过本文档你将学习到

  • 为什么需要分布式全局唯一ID以及分布式ID的业务需求 ?
  • ID生成规则部分硬性要求?目标出现了,就知道我们该怎么做了。
  • ID号生成系统的可用性要求
  • 一般通用方案,大部分我们都是怎么玩这个唯一ID的?
  • 王者玩家怎么玩的?

1 为什么需要唯一ID

复杂的分布式西戎中,需要大量的数据和消息进行唯一标识,订单号,用户UID等等,你需要一个全局的唯一的ID。

2 要求

2.1 生成规则的硬性要求:

  • 全局唯一
    不能出现重复的ID号,既然是唯一标识,这是最基本的要求
  • 趋势递增
    在MySQL的innoDB引擎中使用的是聚集索引,由于多数RDBMS使用Btree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。
  • 单调递增
    保证下一个ID大于上一个ID,。为什么? 这个可以参考InnoDB存储引擎的特点,

关于mysql的数据底层是怎么保存数据的,B+树又是什么?可以自己去查看《mysql必知必会》+《MySQL技术内幕:InnoDB存储引擎》 + 极客时间 mysql实战45
《数据结构与算法》详细解释了什么二三树 AVL树 b+树等等
如果不怎么熟悉mysql,一上去就看经典《高性能mysql》你会一脸懵逼。

  • 信息安全
    如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可 所以在一些应用场景下,需要ID无规则 不规则,让竞争对手不好猜
  • 含时间戳
    这样就能在开发中快速了解分布式id的生成时间

2.2 生成系统的可用性要求:

  • 高可用
    发一个获取分布式ID的请求,服务器就要保证99.999%的情况下给我创建一个唯一分布式ID
  • 低延迟
    发一个获取分布式ID的请求,服务器就要快,极速
  • 高QPS:10万个的请求同时过来。
    假如并发一口气创建分布式ID请求同时杀过来,服务器要顶得住且一下子成功创建10万

3常用的几种方案

你不要一上来就扯用雪花算法,然后分享结束。这就是在扯。当别人问题用什么,你只能回答看业务需求。假如一个项目只有100个用户,你说生成UID,用雪花算法。需要么?直接DB自增不就可以了么?

UUID
如果只考虑唯一性,OK 入数据库性能差?为什么差还得看那几本书。
数据库自增主键
不解释了,低延迟什么高QPS 搞不定,

基于redis生成全局id策略 我们项目种使用的好像就是这个
单机:因为Redis是单线的天生保证原子性,可以使用原子操作INCR和INCRBY来实现


集群

王者
Twitter的分布式自增ID算法snowflake


snowflake
snowflake
snowflake

snowflake

具体时间


具体时间

雪花算法java源码

https://www.jianshu.com/p/2a27fbd9e71a

工作种就是把源码粘贴一下封装下直接用么?不好意思,你想到到别人都想到了,直接有封装好的工具包 maven引入搞起。

糊涂工具包 就是我们每个工程里面都有一些untils包,这个maven引入,几乎你想到的都有。

https://hutool.cn/

https://github.com/looly/hutool


    cn.hutool
    hutool-captcha
    5.2.0

核心代码IdGeneratorSnowflake

image.png

你可能感兴趣的:(高并发下如何生成唯一ID)