自增id:存储空间小,性能高,但在分布式系统,以及多数据库数据交换,会出现问题。

uuid:优点就是保证唯一,本身具有无序性,正式系统推荐使用uuid。

但是因为UUID是无序性的,本身的size过大,作为主键会涉及大量索引重排。

名称 有序 分布式
自增
uuid

因为分布式的优先级大于是否有序,所以数据库不能使用自增主键。

这时候需要一份分布式且有序的主键生成算法:雪花算法。

/*** @author qushen* @create 2022/5/29 10:51*/
public class SnowFlake {/*** 组成部分*///最高符号为0//时间戳private final long  fixedTimeStamp=1234567L;//机房idprivate  long computerRoomId;//机器idprivate  long machineId;//序列号 默认初始值为0private  long sequence =0L;/*** 设置每个组所占用的bit*///最高符 占用1bit//时间戳 占用41bit//机房id 占用5bitprivate final long computerRoomBitCnt=5L;//机器id 占用5bitprivate final long machineBitCnt=5L;//序列号 占用12bitprivate final long sequenceBitCnt=12L;/*** 设置每个组 位移的位数*///机器id  左移12位(序列号所占的位数)private final  long machineIdShift=sequenceBitCnt;//机房id  左移12+5位(序列号+机器id所占的位数)private final  long computerRoomIdShift=sequenceBitCnt+machineIdShift;//时间戳  左移12+5+5位(序列号+机器id+机房id所占的位数)private final long timeStampShift=computerRoomIdShift+computerRoomBitCnt;/*** 聚合信息*///支持的最大 机房id为31位=2^5-1private final long maxComputerRoomId=-1 ^(-1 << computerRoomBitCnt);//支持的最大 机器id为31位=2^5-1private final long maxMachineId=-1 ^(-1 << machineBitCnt);//序列号掩码private final long sequenceMask=-1 ^(-1 << sequenceBitCnt);//上一次生成的时间戳private  long lastTimeStamp=-1L;public SnowFlake(long computerRoomId,long machineId){if(computerRoomId<0 || computerRoomId>maxComputerRoomId){throw new IllegalArgumentException("computerRoomId out of range");}if(machineId<0 || machineId>maxMachineId){throw new IllegalArgumentException("machineId out of range");}this.computerRoomId=computerRoomId;this.machineId=machineId;}/*** 返回毫秒级的时间戳* @return*/protected  long getCurrentTime(){return System.currentTimeMillis();}protected  synchronized  long getNexId(){//拿到时间戳long currentTimeStamp  =getCurrentTime();if (currentTimeStamp==lastTimeStamp){sequence = (sequence+1) & sequenceMask;  //取模//代表该毫秒级所能生成的唯一id已经使用完了if(sequence == 0){currentTimeStamp = getNexMillis();}}else {sequence = 0;}lastTimeStamp =currentTimeStamp;//唯一Idreturn (currentTimeStamp - fixedTimeStamp<< timeStampShift) |(computerRoomId << computerRoomIdShift) |(maxMachineId << machineIdShift) |sequence ;}protected long getNexMillis(){long currentTimeStamp=getCurrentTime();while(currentTimeStamp<=lastTimeStamp){currentTimeStamp =getCurrentTime();}return  currentTimeStamp;}public static void main(String[] args) {SnowFlake snowFlake = new SnowFlake(0, 0);System.out.println(snowFlake.getNexId());}
}

数据库使用自增还是uuid,推荐雪花算法相关推荐

  1. Python ID 生成(UUID、自增、19位雪花算法ID)

    UUID UUID(Universally Unique Identifier)是通用唯一识别码,在许多领域用作标识,比如我们常用的数据库也可以用它来作为主键,原理上它是可以对任何东西进行唯一的编码的 ...

  2. 分布式自增ID算法---雪花算法 (snowflake,Java版)---算法001

    一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...

  3. 雪花算法id长度_【Java】分布式自增ID算法雪花算法 (snowflake,Java版)

    作者:H__D 转载自: https://www.cnblogs.com/h--d/p/11342741.html 一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. ...

  4. java 雪花算法生成ID

    一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...

  5. C语言雪花算法,记一次雪花算法的实现

    作者最近在实现雪花算法生成主键,看了不少文章.个人觉得雪花算法的最大的优点是有序(减少数据库的页分裂页合并).雪花算法本身很简单,但他依赖于时间,也就是机器或容器的时间一回拨就出现问题了.网上也出现了 ...

  6. 为什么不推荐使用uuid或者雪花id作为主键?

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.MySQL和程序实例 1.1 要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid,use ...

  7. 为什么MySQL不推荐使用uuid或者雪花id作为主键?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:Yrion cnblogs.com/wyq178/p/125 ...

  8. 为什么MySQL不推荐使用 UUID 或者雪花id作为主键?

    作者:Yrion 来源:http://dwz.date/czf4 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键i ...

  9. easycode不推荐使用_为什么?mysql不推荐使用uuid或者雪花id作为主键?

    前言: 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不 ...

最新文章

  1. 13、GridView案例
  2. python实训项目-实验楼Python项目
  3. 表必须要有主键吗_玄关隔断什么材质好?玄关隔断必须要做吗?
  4. python excel 数据匹配实现vlookup功能_如何用python实现excel中的vlookup功能?
  5. A^n=E;则(A*)^n=?
  6. java 拆箱 类型不对,Java基本类型于对象类型的拆箱和装箱
  7. 【C/C++】变量的内存分配
  8. (九)洞悉linux下的Netfilteriptables:网络地址转换原理之DNAT
  9. Linux学习笔记3 - 目录和文件管理
  10. 干货十足:一大波好用的Windows软件帮你开路!
  11. JAVA自动装箱和拆箱功能是把双刃剑
  12. 自己动手写CPU——寄存器堆、数据存储器(基于FPGA与Verilog)
  13. LED点阵屏中“鬼影”现象的分析与解决
  14. 霍尼韦尔和陕西西咸新区签订投资战略协议;雀巢专业餐饮成都客户交流体验中心落成 | 美通企业日报...
  15. 提高APP冷启动速度小结
  16. 深度学习之目标检测--Pytorch实战
  17. 凝思软件冲刺深交所:年营收不足2亿 拟募资7.9亿
  18. 如何搭建真正能洞悉数据的领导驾驶舱
  19. PC用PSV游戏下载工具NPS_Browser+本地缓存文件
  20. zoj 1203 Swordfish

热门文章

  1. 【邀请函】相约2022中国(南京)软博会,现场见!
  2. 中缀转后缀表达式、逆波兰表达式、leetcode224、227
  3. SAP BP 销售分销下售达方描述与客户不一致情况解决
  4. auto与decltype
  5. 关于JAVAOO项目
  6. 开销(Overhead)究竟是什么?
  7. Last.fm数据集主要属性:artist,album, and track name
  8. 九耶丨阁瑞钛伦特-大型计算机的操作系统
  9. 驾驶证理论测试显示软件未激活,驾照理论测试
  10. oracle数据库扩大表空间,[小技巧]手工扩大Oracle数据库表空间的方法