单库下⼀般使用Mysql自增ID,但是分库分表后,会造成不同分片上的数据表主键会重复
需求:性能强劲、全局唯一、防止恶意用户规矩id的规则来获取数据
利用自增id, 设置不同的⾃增步长:auto_increment_offset
、auto-increment-increment
DB1: 单数
//从1开始、每次加2
DB2: 偶数
//从2开始,每次加2
缺点:
性能非常高,没有网络消耗
缺点:
利用Redis的INCR和INCRBY来实现,原子操作,线程安全,性能比Mysql强劲
缺点:
缺点:
bit(位):电脑中存储的最小单位,可以存储⼆进制中的0或1
byte(字节):⼀个byte由8个bit组成
常规64位系统⾥⾯java数据类型存储字节大小
int:4 个字节
short:2 个字节
long:8 个字节
byte:1 个字节
float:4 个字节
double:8 个字节
char:2 个字节
科普:数据类型在不同位数机器的平台下长度不同
16位平台 int 2个字节16位
32位平台 int 4个字节32位
64位平台 int 4个字节32位
雪花算法生成的数字,long类,所以是:8个byte,64bit
表示的值 -9223372036854775808(-2的63次方)~9223372036854775807(2的63次⽅-1)
生成的唯⼀值⽤于数据库主键,不能是负数,所以值为0~9223372036854775807(2的63次方-1)
分布式部署就需要分配不同的workId, 如果workId相同,
可能会导致⽣成的id相同
分布式情况下,需要保证各个系统时间⼀致,如果服务器的时钟回拨,就会导致⽣成的 id 重复
什么时候会系统回拨?
配置文件
增加:
#配置workId
spring.shardingsphere.sharding.tables.product_order.key-generator.props.worker.id=1
方式一:订单id使用MybatisPlus的配置,ProductOrder类配置
@TableId(value = "id", type = IdType.ASSIGN_ID)
默认实现类为DefaultIdentifierGenerator雪花算法
方式二:使用Sharding-Jdbc配置文件,注释DO类里面的id分配策略
#id⽣成策略
spring.shardingsphere.sharding.tables.product_order.key-generator.column=id
spring.shardingsphere.sharding.tables.product_order.key-generator.type=SNOWFLAKE
方式三 进阶:动态指定sharding jdbc 的雪花算法中的属性work.id属性
使用sharding-jdbc中的使用IP后几位来做workId,但在某些情况下会出现生成重复ID的情况
解决办法: 在启动时给每个服务分配不同的workId, 引⼊redis/zk都行,缺点就是多了依赖
可以看出id全局不重复,并呈现出递增增长