基于 Redis 的全局唯一性ID生成器的一些实现思路

前段时间正值开发ID生成中心,看到很多业界大神分享了自己公司的ID生成器的设计思路。现在分享一下自己的思路,供大家参考、吐槽。

业务需求及业内方案,在许多文章中都有介绍,我在这里就不多介绍了。现在直入主题,谈谈自己的设计思路。

基于 Redis 的全局唯一性ID生成器的一些实现思路基本介绍

基于 Redis 的全局唯一性ID生成器的一些实现思路

1.MySQL记录注册的应用服务信息及生成的应用唯一标识authID。

2.高可用的Redis记录注册的IDKey(应用中ID的唯一标识,一个应用可以申请多个ID)并负责生成、分发ID区间(利用Redis中incr特性)。这里Redis必须保证高可用,至少为双机热备保证数据不丢失。当然这里的IDKey注册可以记录在MySQL中。

3.ID生成中心使用L1、L2缓存从Redis中获取到的ID区间,并实时同步。

4.下游服务可以直接通过Http/RPC,从ID生成中心获取ID。

5.下游服务也可以通过在项目中引入ID生成客户端依赖包来获取ID。因为目前我们并没有那么高频的需求,所以暂时没有开发。

对外接口

基于 Redis 的全局唯一性ID生成器的一些实现思路基于 Redis 的全局唯一性ID生成器的一些实现思路基于 Redis 的全局唯一性ID生成器的一些实现思路

1.注册应用服务。

2.注册应用IDKey服务。

3.获取ID服务。

4.获取ID区间服务。

基于 Redis 的全局唯一性ID生成器的一些实现思路

ID生成机制

基于 Redis 的全局唯一性ID生成器的一些实现思路
基于 Redis 的全局唯一性ID生成器的一些实现思路

1.ID生成中心每次从Redis(使用incr命令)中获取一定范围的递增ID区间(该区间范围相对大一些,eg:10000),并同步缓存至L1、L2避免大量ID区间丢失)。

2.当该应用的该IDKey的ID区间使用率超过一定阈值(eg:>50%)时,ID生成中心自动从Redis(使用incr命令中获取下一个递增ID区间,缓存至L1、L2,减少消费耗时。

3.当ID生成中心宕机,再次启动时,会优先同步L2中的ID区间至L1中,如果没有再从Redis中通过incr获取,已达到节约ID的目的。

4.这里L1、L2的ID数据同步是异步进行的。

5.ID生成客户端的基本设计思路也是差不多一样的。只不过这是获取的ID区间相对ID生成中心从Redis获取的ID区间会小很多,这里尽量保证俩者区间段有一个相当大的比例区间。对于获取的ID区间具体大小,可以根据个人的需求取舍。

测试结果

单线程调用5000次,RPC平均耗时1ms,Http平均耗时3.7ms


参考链接

基于 Redis 的***服务的设计 一帅同学 泛金融技术

干货 | 分布式架构系统生成全局唯一***的一个思路 丁宜人 携程技术中心

分布式ID生成器 | 架构师之路 58沈剑 架构师之路

Leaf——美团点评分布式ID生成系统 照东