当前位置: 首页 > 工具软件 > Leaf-go > 使用案例 >

1、美团开源的leaf-mysql实现全局唯一ID之从数据库中读取数据

阎啸
2023-12-01

1、首先看一下在数据库中建立的表结构:

CREATE TABLE `leaf_alloc` (
  `biz_tag` varchar(128)  NOT NULL DEFAULT '',//主键,这个应该是用来区分不同的业务线的
  `max_id` bigint(20) NOT NULL DEFAULT '1',//最大ID
  `step` int(11) NOT NULL,//步长
  `description` varchar(256)  DEFAULT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB;

2、代码在leaf-code的segment包下,核心代码在SegmentIDGenImpl中
3、一个关键组件IDAllocDao,应该就是通过这个组件实现与数据库的crud
4、关键方法init()方法,里面有updateCacheFromDb(),updateCacheFromDbAtEveryMinute(),这个方法看起来像一个定时线程,每分钟都从数据库中加载一些数据
5、updateCacheFromDb()中,先查出来多个biz_tag,针对每个biz_tag在内存中初始化一个SegmentBuffer
6、核心数据结构:SegmentBuffer,包含了一个tag、Segment[](双buffer)、step、minStep、双号段标志位等
7、核心数据结构:Segment,代表一个号段,包含一个AtomicLong类型的value,一个号段最大值max,一个号段步长step
8、updateCacheFromDbAtEveryMinute()方法中用线程池开启了一个定时任务
9、在定时任务中定时执行updateCacheFromDb,定时从数据库中读取数据

技术亮点:
1、核心数据结构中value用了AtomicLong类型,max和step用了volatile,保证内存可见性
2、updateCacheFormDb针对数据库操作,用了多个缓存cacheTags\insertTags\removeTags

 类似资料: