生成分布式序列ID

生成分布式序列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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,453评论 0 9
  • 数据库范式 https://www.zhihu.com/question/24696366 索引 索引可以加快数据...
    EakonZhao阅读 3,286评论 3 23
  • 转载:细聊分布式ID生成方法 一、需求缘起 几乎所有的业务系统,都有生成一个记录标识的需求,例如: (1)消息标识...
    meng_philip123阅读 2,589评论 0 17
  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 826评论 0 3
  • 最近碰到几个业务场景,会遇到并发的问题。在单实例情况下,我们会通过java.util.concurrent包...
    菜鸟小玄阅读 2,277评论 0 5