主键生成策略

本文详细探讨了主键生成策略,包括自动增长、UUID、Redis、SnowFlake以及利用Zookeeper生成唯一ID的方法,分析了各种策略的实现、优缺点,为数据库设计提供了参考。
摘要由CSDN通过智能技术生成

主键生成策略

1.什么是主键?

主键,即主关键字,是被挑选出来,作表的行的唯一标识的候选关键字。

一个表只有一个主关键字。主关键字又可以称为主键。 主键可以由一个字段,也可以由多个字段组成,分别称为单字段主键或多字段主键。又称主码。

2.生成主键的必要性?

主键可以用来表示一个精确定位特定的行,如果没有主键,你就无法精准定位一条记录是否就是你要的相关行记录,这样就会导致更新或删除表中特定的行很困难。

3.生成主键的策略?

  1. 自动增长(AUTO INCREAMENT)
  2. UUID
  3. Redis
  4. SnowFlake
  5. 利用zookeeper生成唯一ID

4.自动增长(AUTO INCREAMENT)

数据库自增长序列或字段。

4.1实现方法

在创建表的时候加入AUTO INCREAMENT语句。

4.2优缺点

优点:实现简单。

缺点:分库分表繁琐,建立新表的时候需要得知上一个表最后一个主键的id,在此基础上进行自动增长。

5.UUID

UUID是通用唯一识别码 (Universally Unique Identifier),可以生成一个长度32位的全局唯一识别码。

5.1实现方法

可以利用数据库也可以利用程序生成。

String uuid = UUID.randomUUID().toString();

5.2优缺点

优点:实现简单,代码方便

缺点:1.没有排序,无法保证趋势增长。

​ 2.32位太长,入库性能差(涉及B+索引树的分裂)

6.Redis

主要依赖于Redis是单线程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY来实现。

6.1实现方法

设置步长和Redis的初始值

6.2优缺点

优点:1.不依赖数据库

​ 2.数字ID天然排序,对分页或者需要排序的结果有帮助。

缺点:编码和配置的工作量大

7.SnowFlake

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。

7.1实现方法

使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。

public class IdWorker{
   

    //下面两个每个5位,加起来就是10位的工作机器id
    private long workerId;    //工作id
    private long datacenterId;   //数据id
    //12位的序列号
    private long sequence;

    public IdWorker(long workerId, long datacenterId, long sequence){
   
        // sanity check for workerId
        if (workerId > maxWorkerId || workerId < 0) {
   
            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0",maxWorkerId
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值