主键策略,数据库id值生成方式及其优缺点

主键策略
一:自动增长(AUTO INCREMENT)
可以在定义数据库时添加这一字段.实现id值的自动增长

例子:假设有三张表主键分别为
在这里插入图片描述不足之处:当我们操作第二张表的时候需要根据上一张表的最后那个数据的id值来进行划分
二:UUID
每次生成一个随机唯一的值
在这里插入图片描述缺点:排序不方便

三:redis实现
在这里插入图片描述优点:
1.不依赖于数据库,灵活方便,且性能优于数据库
2.数据ID天然排序,对分页或者需要排序的结果很有帮助
缺点:
1.如果系统中没有Redis,还需要引入新的组件,增加系统的复杂度
2.需要编码和配置的工作量比较大

四:mp自带的策略(雪花算法)
SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:

在这里插入图片描述 1.
1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。
2.
41bit-时间戳,用来记录时间戳,毫秒级。
3.
10bit-工作机器id,用来记录工作机器id。
可以部署在2^{10} = 1024个节点,包括5位datacenterId和5位workerId
5位(bit)可以表示的最大正整数是2^{5}-1 = 31,即可以用0.1.2.3、…31这32个数字,来表示不同的datecenterId或workerId
4.
12bit-序列号,序列号,用来记录同毫秒内产生的不同id。
12位(bit)可以表示的最大正整数是2^{12}-1 = 4095,即可以用0.1.2.3…4094这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号。
由于在Java中64bit的整数是long类型,所以在Java中SnowFlake算法生成的id就是long来存储的。

SnowFlake可以保证:
1.所有生成的id按时间趋势递增
2.整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值