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