前言
分布式锁中,我们会使用唯一ID宣誓锁的归属
数据库中用主键ID记录每一行变更绑定
分库分表的系统中,用ID生成,来保证全局唯一
分布式ID的要求
UNIQ 唯一性:ID,ID 要的就是唯一
HP 高性能:生成ID的服务,不能成为瓶颈
HA 高可用:保证高可用,如果ID是订单ID,突然ID服务宕机,影响全局交易就不好了
趋势:递增还是随机,看场景需要
生成全局唯一ID的方法
一、UUID(唯一的机器生成表示符,简单理解为唯一值,重复的概率很小)
java中idea生成UUID的方法,通过鼠标点击类名,Alt+insert键就会出现生成UUID的选项。
java中特殊的库和方法可以生成UUID
二、Redis incr
redis作为单线程的NoSql系统,使用incr就高性能的生成唯一的单调递增的ID
(可用性不是很高)
三、Snowwflkae雪花算法
基本原理图
符号位:计算机处理二进制数据时的一位,用来确定数据的正负
时间戳:能够表示一份数据在一个特定的时间点已经存在的完整的可验证的数据(通俗理解,表示为某一时刻的一个时间),主要用于清理缓存,大多用于版本更新。
机器码:用户注册的时候会根据用户软件所安装的计算机硬件信息生成唯一的识别码
序列号:软件生成的一个识别码(主要作用是电子产品为了防止自己的软件被用户盗用)
优点:
能满足高并发分布式系统环境下ID不重复(ID的唯一性)
基于时间戳,可以保证基本有序递增(通过操作时间的不同)
不依赖第三方的库或者中间件(算法)
生成效率极高
(并不万能,可能存在问题:
1、即使每毫秒4096,还是可能会是瓶颈
2、雪花ID是长整型,直接用来做SQL的主键,比较浪费空间
3、依赖时间机制,可能会有实现回拨(如果发现时间回退需要抛出异常)