这个逻辑是仿照Leaf 写的ID分发器,因为本身系统中的id是通过表的方式生成的,使用类似mybatis的selectKey 方式生成的
@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来切换。
整体代码如下