背景

很多系统中往往需要一个全局唯一的id,例如订单号,用户id。

现在在积分日志分库分表情况下需要唯一id。数据异构之间的同步,如果不是唯一id,可能发生冲突。

设计

要求

  • 唯一id
  • 最好单调递增(对MySQL页面存储有利,避免频繁页分裂)
  • 最好用数字,节省空间

实现

版本一

采用唯一记录行记录id,每次获取id,先获取再更新。

存在性能瓶颈,取决于单行数据的更新tps,数据库连接存在瓶颈。

版本二

原来每次获取1个id,现在每次获取一段id。

采用乐观锁更新,考虑更新频率不算高。

并且加载一段id后,当使用到一半,由异步线程更新下一段。

数据库设计:当前值,每段大小,步长

总结

成功将分布式id的性能提高50%以上,只需要在内存中获取。并且同步异步加载第二段,消除加载过程中的耗时。

竞争状态下的并发安全由乐观锁控制,先读取后更新,发现更新失败重新读取。