java⽣成唯⼀有序序列号_分布式唯⼀ID的⽣成⽅案
分布式ID的特性
全局唯⼀
不能出现重复的ID,这是最基本的要求。
递增
java生成随机数的方法
有利于关系数据库索引性能。
⾼可⽤
既然是服务于分布式系统,为多个服务提供ID服务,访问压⼒⼀定很⼤,所以需要保证⾼可⽤。
信息安全
如果ID是有规律的,就容易被恶意操作,在⼀些场景下需要ID⽆规则。
⽣成⽅案
UUID
核⼼思想是结合机器的⽹卡、当地时间、⼀个随机数来⽣成。
优点:
性能⾮常⾼,本地⽣成,没有⽹络消耗。
⽣成简单,没有⾼可⽤风险。
有利于信息安全,因为可读性差,⽆规律。
缺点:
太长,不易于存储。
有利于信息安全的同时,也有不安全性,因为基于MAC地址⽣成的算法可能会泄露MAC地址。
⽆序,对MySQL索引不利,在 InnoDB 中,⽆序性会导致数据位置频繁变动,性能低下。
数据库
利⽤数据库⾃增ID的特性来⽣成,如 MySQL 的 auto_increment。
优点:
简单,利⽤数据库⾃有功能实现。
绝对有序。
缺点:
有重复发号的风险,例如数据库主从切换的场景。
需要特别保障其⾼可⽤。
发号性能限制于数据库性能,如需提⾼发号能⼒,需要扩充数据库,成本⾼。Redis
Redis 提供了⾃增的原⼦命令,可以保证唯⼀、有序。
优点:
简单,⾃有能⼒。
⾼并发环境下性能好,优于数据库。
维护成本低于数据库。
缺点:
主从切换时也可能会重复发号。
需要特别保障其⾼可⽤。
雪花算法
给每台机器分配⼀个唯⼀标识,然后通过下⾯的结构实现全局唯⼀ID:时间戳 + 机器标识 + ⾃增序列号
毫秒在⾼位,⾃增序列在低位,⼀定是递增的。
优点:
⽣成性能⾼。
灵活,可以根据⾃⾝业务特点分配bit位。
缺点:
强依赖机器时钟,如果时钟回拨,就会导致服务异常。
⼩结
不同的⽅案有不同的特点,需要根据⾃⼰的需求场景来选择适合的。
例如在美团早期,ID⽅案就是多种形式的:
有的业务通过 DB ⾃增的⽅式⽣成
有的业务通过 Redis 缓存来⽣成
有的业务直接⽤ UUID ⽣成
后来推出了⼀个类雪花算法的分布式ID服务:Leaf,QPS压测结果近5w/s。
项⽬地址:
再推荐2个参考项⽬:
基于 Redis 的⽣成器
百度基于雪花算法的⽣成器

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。