生成分布式序列ID

2019-06-16  本文已影响0人  majinliang123

生成分布式序列ID

介绍

在很多分布式系统中,需要生成唯一的id。如在分库分表的情况下,给某个逻辑表生成唯一id。既要保证id的唯一性,也需要保证生成id的性能,而且需要持久化,防止在id生成器重启之后,造成id不唯一。

实现

https://gitee.com/majinliang123/messtin-sequence

思路

使用数据库记录下一个id

当想获取id时,需要查询数据库,数据库中的值就是你想要的下一个值。但是在这个过程中,可能有多个id生成器同时想要生成下一个id,所以都在更新数据库。在我们更新数据库时,需要将id更新为id + 1,然后查询这个id值,id - 1就是我们想要的。这两步操作必须在同一个事务中,使用数据库的事务保证id更新过程中不会发生错乱(当我们更新id时,数据库会阻塞其他的更新操作,直到我们事务提交,其他的更新操作才能更新id的值,这就保证了数据库中id的正确性)。不应该先读再更新,因为在读的过程中,可能已经有其他id生成器更新了这个值,导致我们读的值是过时的。

每次获取多个id,以防多次更新数据库

在我们更新数据id时,仅仅id + 1是不够的,这会造成我们频繁的更新数据库,性能比较低。一般我们每次更新都是id + 500,这样在当前id生成器中就有500个id可以分配(id ~ id + 500 -1),当分配完再去数据库中取下一批id,必须保证id生成器的线程安全。在id生成器中保存着当前id生成器的当前id和最大id,当当前id达到最大id,就取数据库中获取下一批。

原文连接 https://github.com/majinliang123/Article/blob/master/%E7%94%9F%E6%88%90%E5%88%86%E5%B8%83%E5%BC%8F%E5%BA%8F%E5%88%97ID.MD

上一篇 下一篇

猜你喜欢

热点阅读