主键问题以及分布式 id

分布式 id 需要处理的问题主要是同一时间在多台机器中保证生成的 id 唯一,为了这么做我们可以这么做:

分布式 id 生成策略

先说几个已经被淘汰的策略引出分布式 id 的问题

1,UUID:UUID 随机并且唯一,在单一的数据库中就不适合作为主键,因为生成的字符串太长不符合索引优化规则

2,自增 ID:不管是数据库自增还是MP自增,分布式数据库中总是要存放一定范围的数据,使用自增策略可能会导致不同数据库存放同一id的问题

以下的方法比较靠谱

3,redis 生成:利用 redis 的 incr 命令生成 id,设置起始值和步长,步长值是配置了多少台 redis,这种方法同样适应与数据库多主模式

4,雪花算法:生成一个64bit的id,也就是long类型的数字,长度适中并且方便快捷

雪花算法

雪花算法是一个比较常见的生成分布式 id 的方式,它会生成一个 8 字节的数据,通过确保每段数据在空间与时间上唯一来确定最终数据的唯一

64bit 中,起始 1bit 为0,闲置不用

接下来 41bit 代表时间戳,这个是毫秒级的时间,存放时间戳的差值(当前时间-固定的开始时间),41位的时间戳可以使用69年

10bit 存放机器 id,前 5bit 代表机器位置(配置在不同地区的机器有不同 id),后 5bit 代表机器 id (一个地区会配置集群)

最后的 12bit 代表流水号,一个毫秒时间内最多可以处理4096个 id

相关推荐
Light603 小时前
模型驱动与分布式建模:技术深度与实战落地指南
分布式·生成式ai·元模型·crdt·模型驱动架构·分布式建模
斯普信专业组12 小时前
Rabbitmq+STS+discovery_k8s +localpv部署排坑详解
分布式·kubernetes·rabbitmq
愚昧之山绝望之谷开悟之坡19 小时前
Kafka 的消费
分布式·kafka
BD_Marathon19 小时前
Kafka下载和安装
分布式·kafka
写bug写bug20 小时前
分布式锁的使用场景和常见实现(上)
分布式·后端·面试
Linux运维技术栈21 小时前
解决程序连不上RabbitMQ:Attempting to connect to/access to vhost虚拟主机挂了的排错与恢复
分布式·rabbitmq·ruby
Warren981 天前
Java后端面试题(含Dubbo、MQ、分布式、并发、算法)
java·开发语言·分布式·学习·算法·mybatis·dubbo
core5121 天前
基于elk实现分布式日志
分布式·elk·日志·logstash
扶风呀2 天前
分布式与微服务宝典
分布式·微服务·架构
Warren982 天前
Java Record 类 — 简化不可变对象的写法
java·开发语言·jvm·分布式·算法·mybatis·dubbo