床长人工智能教程免费文档——sharding
.
声明:本人只是分享一些床长人工智能教程相关的免费pdf文档而已,并非床长人工智能网校的收费文章。尊重版权,支持原创!
在我们进行开发工作时,数据库表主键自动生成是一个基本的需求,而且大多数数据库也提供了基本的解决方案,比如的自增主键的自增序列。
但是我们进行了分库分表后,同一个逻辑表内的不同实际表之间的自增键由于无法互相感知而产生重复主键。
目前有许多第三方解决方案可以完美解决这个问题,如等依靠特定算法自生成不重复键,或者通过引入主键生成服务等。
为了方便用户使用满足不同用户不同使用场景的需求,不仅提供了内置的分布式主键生成器,例如,还抽离出分布式主键生成器的接口,方便用户自行实现自定义的自增主键生成器。
下面介绍几种分布式的生成策略
的标准型式包含个进制数字,以连字号分为五段,形式为的个字符,示例
中包中直接提供了生成的方法
优点
因为是本地生成的,所以没有网络消耗,性能非常高。
缺点
太长了!是一个长度的长字符串,不利于存储。
不太安全,基于地址生成,会造成地址泄露。
不适用于作为主键,以为例,官方建议主键长度越短越好,而则是位,不建议适用并且因为其无序性,如果作为主键插入时会引起数据位置的频繁变动,严重影响性能。
数据库生成
以为例,在设置主键时可以通过设置自动递增来保证自增。
优点
实现简单,基于数据库功能实现,不需要编码,对开发成本小。
有顺序递增,在某些业务场景下非常适用,适用于作为的主键,也是官方推荐的主键生成策略。
缺点
对数据库依赖太高,当数据库异常时,整个系统不可用。
性能不高,主要性能限制为单台的读写性能。
对于以上的缺点性能问题,可以有以下的方案来进行解决
多部署几台机器,每台机器设置不用的初始值,步长和机器数量相同。
例如台机器,初始值为,初始值为,步长都为,则的号段为,的号段为。
同理,如果部署台机器,则每台的初始值依次为,,步长为,则整体架构如下
雪花算法
来源于,原理是生成一个大小的长整型。
如果分片键不设置值,则默认使用生成一个值。
先说说优点
生成能够按照时间有序生成
算法生成的结果是一个大小的整数,换算为长整形为位
分布式系统内不会产生重复
原理
编号由四部分组成,从高位到低位从左到右分别是
符号位长度,等于。
时间戳长度,从零点开始的毫秒数,支持年。
工作进程编号长度,所以最多支持也就是个进程。
序列号自增编号长度,每毫秒从开始自增,支持也就是个编号。
可见,每个工作进程每毫秒可以产生最多个,则每秒可以产生个。
放一波代码
时间偏移量,从年月日零点开始自增量占用比特工作进程比特自增量掩码最大值工作进程左移比特数位数时间戳左移比特数位数上一次的序列号,解决并发量小总是偶数的问题工作进程最后自增量最后生成编号时间戳,单位毫秒浏览工作进程编号生成的规则后,感觉对服务器后位特别是数值比较约束。
有以下优化思路因为工作进程编号最大限制是,我们生成的工程进程编号只要满足小于即可。
针对最大。
而。
因此采用段数值相加即可生成唯一的,不受位限制,。。。