在项目开发过程中,经常使用一定的策略来生成主键,比如Oracle数据库中的序列,MySQL数据库中的自增主键。但实际开发过程中,很多时候需要在程序中获取到主键,比如生成订单对象时,需要生成订单和订单项,订单项中通过设置订单ID字段,实现订单与订单项的关联,此时就需要在程序中直接获取到订单ID,然后分别赋值给订单对象的ID及订单项对象的订单ID字段。在这种场景下,使用oracle序列还容易处理,但使用MySQL数据库时实现就比较困难了,尤其是在高并发情况下能否保证高性能的生成ID将决定生成订单的效率。下面就介绍三种实现高性能生成ID的方法。
统一的接口:
IdProviderInteface
/**
*根据表名及要获取的ID数量返回一批主键数组
*/
long[] getId(String tableName,int size);
基于oracle序列的ID生成策略
需要借助一张表与序列名的关系表,主要字段为tablename, ssequenceName
基于MySQL主键表的ID生成策略
基于redis队列的ID生成策略
2和3与1的核心思想相同,均为“异步将ID缓存到本地队列”,通过操作本地队列直接获取到表对应的主键。
基于redis队列的ID生成策略,根据redis数据二代自增操作incr操作获取一个原子递增的数值。实际情况下及时redis操作虽然很快,但仍有网络IO,相对从本地队列获取数据还是慢了很多,因此也可以使用“异步将ID缓存到本地队列”的思想实现用户线程从本地队列获取到主键。
由于最近比较忙,没有使用代码来实现具体的功能,具体实现将在下一篇文章中详细介绍。
每周一篇经验分享,欢迎关注我的订阅号!
文章转载自itfeng,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。