这个逻辑是仿照Leaf
写的ID分发器,因为本身系统中的id是通过表的方式生成的,使用类似mybatis
的selectKey
方式生成的
less
代码解读
复制代码
@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
来切换。 整体代码如下
这边整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】免费获取