从零开始java分布式主键篇:分布式id

本文探讨了在分布式环境中如何生成唯一主键,从MySQL自增主键的风险开始,介绍了数据库层面(如设置步长、查询MAX(ID)、单独ID表、Redis)和应用层面(如UUID、其他算法)的各种策略,最后提到了雪花算法作为解决方案。
摘要由CSDN通过智能技术生成

目录

 

一:Mysql自增排序  

二:Mysql的主键排序

三.分布式主键策略

1.集群或者分布式下数据库自增主键带来的风险

2.分布式主键方向  

3.数据库层面方案(一)设置步长

(1)方案

(2)优点

(3)缺点

4.数据库层面方案(二)查询MAX(ID)  

          (1)方案

(2)优点

(3)缺点

5.数据库层面方案(三)-单独一张id表

6. 数据库层面方案(四)-redis 

(1)方案

(2)优点

(3)缺点

7.应用层面(一)-UUID

 (1)方案

(2)优点

(3)缺点

8.应用层面(二)-其他算法

(1)方案

(2)优点

四:雪花算法


一:Mysql自增排序  

  在日常的开发中,大都数的时候我们熟悉使用了Mysql的自增主键。但是这种方案使用在单体单机应用下,一旦出现集群或者分布式环境就会出现主键不唯一的问题。

  下面我们将从Mysql的自增主键说起以及解决分布式主键生成策略。

二:Mysql的主键排序

   谈到主键排序就不得不提到引擎,因为在Mysql的之间排序是由引擎来决定的。在Mysql中,我们常用的数据库引擎有2个:MyISAM和InnoDB,在大多数的开发的场景我们使用的是后者。我大概记得应该在Mysql5.4之后,Mysql的默认引擎由MyISAM变成了InnoDB。

  下面我们简单比较一下这2个引擎的区别:

(1)InnoDb:支持事物,行级锁,以及全文索引。

(2)MyISAM:大数据读取快(因为MysISAM会存储select count(*)),不支持事务杭锁等。

  下面再来简单比较一下2个引擎读取数据的顺序

(1)InnoDB:按照主键进行排序(因为主键实则就是一种索引规则)

(2)MyISAM:按照堆表结构方式排序

                         ps:一旦MyISAM出现增删改时,顺序就会乱

  下面我们再来简单标记一下2个引擎的使用场景

(1)InnoDB:大多数的开发场景,目前我们使用的MYSQL都是使用的默认引擎

(2)MyISAM:一些不需要事物支出的,比如单纯的订单,操作日志等

  下面我们来简单比较一下2个引擎排序的原理

(1) InnoDB:聚簇索引表

   聚簇索引表,表数据和主键一期存储,一级节点存储行数据,二级节点存储主键值。因此,我们常常在建表就指定一个默

             认。大大提高了I/O密集型应用的性能。

(2)MyISAM:堆表结构

   在默认的情况下,不做修改等,会按照插入的顺序。

三.分布式主键策略

  不用问这里的策略针对分布式,针对InnoDB引擎。

1.集群或者分布式下数据库自增主键带来的风险

  在数据库集群或者分布式数据库情况下,依照Mysql自增主键会带来主键不唯一的问题。比如A,B俩表做了集群部署,数据随机插入2个表,查询时就会出现2个表一定会出现同样主键问题。

2.分布式主键方向  

  结合翻阅的资料,目前解决分布式主键有2个方向的:应用层面和数据库层面。

  应用层面:由应用程序作为生成主键的主要解决方案。一般参考UUID和时间戳作为唯一方向。

  数据库层面:由存储数据库本身或者全局数据库比如Redis作为依据。

3.数据库层面方案(一)设置步长

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值