Java基于队列实现ID分发器

219 阅读1分钟

这个逻辑是仿照Leaf 写的ID分发器,因为本身系统中的id是通过表的方式生成的,使用类似mybatisselectKey 方式生成的

@Insert({  
"UPDATE sequence SET id=CASE WHEN id+1>max THEN min ELSE id+1 END WHERE stub=#{name}"  
})  
@SelectKey(statement = "SELECT id FROM sequence WHERE stub=#{name}", keyProperty = "id", before = false, resultType = Long.class )

但是这样势必会产生锁竞争,在高并发的场景下Mysql的CPU会由于等待锁,去查询死锁可能,使用率飙升,并发大的时候可能会宕机。所以就相当利用预生成id的方式来获取id leaf是一个完整的id生成策略,如果是新系统的话完全可以使用,但是我们的系统中还存在很多原来的获取id的地方,所以利用Queue来存储生成的id,为了防止id使用完毕的生成逻辑耗时,用两个Queue来切换。 整体代码如下

id生成器.png