java 实现连续自增

鶴嘯九天 发布于 09/20 13:50
阅读 998
收藏 0

背景:

1、分布式服务,存在多个节点;

2、不使用mysql的自增主键;

3、让数据库中的某一列按照最大值进行递增;

问题:

1、如果使用 mysql 的 max 函数提交, 则存在事务问题;

2、如果使用 redis 递增,则缓存丢失后需要重新加载,分布式情况下如果保证数据进行加锁处理;

加载中
1
AntoniChan
AntoniChan

个人建议用雪花算法的分布式ID

鶴嘯九天
鶴嘯九天
自然增长数有没有什么好的方案
1
1033
1033

问题2: 都用redis了, 又是分布式环境, 当然是分布式锁。缓存丢失重加载以及数值分配过程都用同一把锁;但是我个人其实不会这么做的,因为在分布式环境中如果要实现分配某个值是连续递增的(中间不允许有空隙),则该值的分配过程就必须串行化;在分布式环境下应当尽量避免此类业务。

鶴嘯九天
鶴嘯九天
是的,redis缓存速度快,但是缓存丢失后,需要加锁处理这个就得不偿失,暂时也没有考虑这个方案;
0
浮云翌日
浮云翌日

用mongodb Update的upsert

0
innerloop
innerloop

AtomicInteger 试试这个呢 多节点 不知道会不会唯一

鶴嘯九天
鶴嘯九天
当然会重复拉
0
tonglingbaoyu
tonglingbaoyu

每个节点向总服务申请一段数值区间用于单调递增 用完后或者快用近的时候 在申请

鶴嘯九天
鶴嘯九天
暂时没有搭建分段自增服务
0
skhuhu
skhuhu

用redis 或者mq队列 预先加载一批数据 (可以用调度任务方式)

0
W
WindSpeed

自己维护表信息,服务启动时取count,然后id就是count++,做好并发处理,就可以了

0
r
rumlee

我的做法是用数据库结合程序缓存,数据库操作的时候用事务控制

节点1访问数据库,拿到n个id,并将数据库中的缓存数+n

这样的做法会导致id和插入的顺序并不是完全递增的,单节点插入的id是完全递增,多节点(因为存在缓存),所以会存在交叉id的情况。不过这并不是什么大问题。既保证了高效率,同时又保证了id的绝对唯一。

返回顶部
顶部