试题
考点

java语言-分布式相关-分布式ID(雪花算法等)

面5笔5

数据库号段模式

前往“校招VIP”小程序,刷题更快
最新校招难题刷题,快来进刷题群吧
解答

数据库主键自增这种模式,每次获取 ID 都要访问一次数据库,ID 需求比较大的时候,肯定是不行的。

如果我们可以批量获取,然后存在在内存里面,需要用到的时候,直接从内存里面拿就舒服了!这也就是我们说的 基于数据库的号段模式来生成分布式 ID。

数据库的号段模式也是目前比较主流的一种分布式 ID 生成方式。像滴滴开源的Tinyidopen in new window 就是基于这种方式来做的。不过,TinyId 使用了双号段缓存、增加多 db 支持等方式来进一步优化。

以 MySQL 举例,我们通过下面的方式即可。

1.创建一个数据库表。

current_max_id 字段和step字段主要用于获取批量 ID,批量 id 为: current_max_id ~ current_max_id+step。

version 字段主要用于解决并发问题(乐观锁),biz_type 主要用于表示业务类型。

2.先插入一行数据。

3.通过 SELECT 获取指定业务下的批量唯一 ID

4.不够用的话,更新之后重新 SELECT 即可

相比于数据库主键自增的方式,数据库的号段模式对于数据库的访问次数更少,数据库压力更小。另外,为了避免单点问题,你可以从使用主从模式来提高可用性。

优点 :ID 有序递增、存储消耗空间小。

缺点 :存在数据库单点问题(可以使用数据库集群解决,不过增加了复杂度)、ID 没有具体业务含义、安全问题(比如根据订单 ID 的递增规律就能推算出每天的订单量,商业机密啊! )。

水平扩展的数据库集群,有利于解决数据库单点压力的问题,同时为了ID生成特性,将自增步长按照机器数量来设置。增加第三台MySQL实例需要人工修改一、二两台MySQL实例的起始值和步长,把第三台机器的ID起始生成位置设定在比现有最大自增ID的位置远一些,但必须在一、二两台MySQL实例ID还没有增长到第三台MySQL实例的起始ID值的时候,否则自增ID就要出现重复了,必要时可能还需要停机修改。

评论
暂无评论

加载更多