一种分布式系统下的自增主键实现方法

[size=medium]在分布式系统中大多数存在着如下的架构形式:[/size]

[img]http://dl.iteye.com/upload/attachment/0068/6014/f7ecb382-492a-3153-8275-2499df1ebb9c.jpg[/img]

系统的被逻辑分为前台应用和数据库两个部分,前台应用通过统一的数据访问层对数据库进行读写操作,前台应用会部署在多台机器上,数据库系统则采用分库分表的形式进行部署。

由此引发的一个问题是,当需要对一个逻辑上的表TABLE1(物理上被分为多个表,形如:TABLE1_0000,TABLE1_0001)采用统一的自增主键时,则会遇到困难,因为采用了分表的策略将无法采用数据库自带的主键生成机制(采用数据库自增主键将使得每张物理表的主键彼此独立)。

在此提供一个分布式的主键生成方案:

1.使用独立的一张表保存,如ids来保存最小未被使用的id值,该表每条记录对应一个业务表的id使用,该表有两个字段key, value, key对应于每个业务表,value是相应的id值
2.每当前台应用初始化的时候,就从该表中读取出value,同时将value + 100后写回ids表中。(表示从value - value+99(该值可以根据实际情况进行设置,越大值回写数据的操作越少,但是若应用启动频繁则id浪费较多) 这个区间内的id值将由该台应用独自使用)。
3.使用两个变量来辅助ID的生成,nextId:下一个Id的值, maxId:当前允许的最大Id,当有生成Id请求时,首先判断 nextId > maxId,若条件成立,则重新执行2中的步骤从ids表中读取并更新value,然后将value赋值给nextId,将maxId赋值为value+99,将nextId加一,并返回旧的nextId的值。(注:增加nextId值的时候需要进行线程同步)

[img]http://dl.iteye.com/upload/attachment/0068/6097/1475969d-d3c2-3440-950b-1180fc4a5ef9.jpg[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值