暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

趋势递增主键生成策略

itfeng 2017-05-07
149

在项目开发过程中,经常使用一定的策略来生成主键,比如Oracle数据库中的序列,MySQL数据库中的自增主键。但实际开发过程中,很多时候需要在程序中获取到主键,比如生成订单对象时,需要生成订单和订单项,订单项中通过设置订单ID字段,实现订单与订单项的关联,此时就需要在程序中直接获取到订单ID,然后分别赋值给订单对象的ID及订单项对象的订单ID字段。在这种场景下,使用oracle序列还容易处理,但使用MySQL数据库时实现就比较困难了,尤其是在高并发情况下能否保证高性能的生成ID将决定生成订单的效率。下面就介绍三种实现高性能生成ID的方法。

统一的接口:

IdProviderInteface

/**

 *根据表名及要获取的ID数量返回一批主键数组

 */

long[] getId(String tableName,int size);

  1. 基于oracle序列的ID生成策略

    需要借助一张表与序列名的关系表,主要字段为tablename, ssequenceName


  2. 基于MySQL主键表的ID生成策略


  3. 基于redis队列的ID生成策略



2和3与1的核心思想相同,均为“异步将ID缓存到本地队列”,通过操作本地队列直接获取到表对应的主键。

基于redis队列的ID生成策略,根据redis数据二代自增操作incr操作获取一个原子递增的数值。实际情况下及时redis操作虽然很快,但仍有网络IO,相对从本地队列获取数据还是慢了很多,因此也可以使用异步将ID缓存到本地队列”的思想实现用户线程从本地队列获取到主键。

由于最近比较忙,没有使用代码来实现具体的功能,具体实现将在下一篇文章中详细介绍。


每周一篇经验分享,欢迎关注我的订阅号!


文章转载自itfeng,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论