数据库使用自增还是uuid,推荐雪花算法
自增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,推荐雪花算法相关推荐
- Python ID 生成(UUID、自增、19位雪花算法ID)
UUID UUID(Universally Unique Identifier)是通用唯一识别码,在许多领域用作标识,比如我们常用的数据库也可以用它来作为主键,原理上它是可以对任何东西进行唯一的编码的 ...
- 分布式自增ID算法---雪花算法 (snowflake,Java版)---算法001
一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...
- 雪花算法id长度_【Java】分布式自增ID算法雪花算法 (snowflake,Java版)
作者:H__D 转载自: https://www.cnblogs.com/h--d/p/11342741.html 一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. ...
- java 雪花算法生成ID
一般情况,实现全局唯一ID,有三种方案,分别是通过中间件方式.UUID.雪花算法. 方案一,通过中间件方式,可以是把数据库或者redis缓存作为媒介,从中间件获取ID.这种呢,优点是可以体现全局的递增 ...
- C语言雪花算法,记一次雪花算法的实现
作者最近在实现雪花算法生成主键,看了不少文章.个人觉得雪花算法的最大的优点是有序(减少数据库的页分裂页合并).雪花算法本身很简单,但他依赖于时间,也就是机器或容器的时间一回拨就出现问题了.网上也出现了 ...
- 为什么不推荐使用uuid或者雪花id作为主键?
欢迎关注方志朋的博客,回复"666"获面试宝典 一.MySQL和程序实例 1.1 要说明这个问题,我们首先来建立三张表 分别是user_auto_key,user_uuid,use ...
- 为什么MySQL不推荐使用uuid或者雪花id作为主键?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:Yrion cnblogs.com/wyq178/p/125 ...
- 为什么MySQL不推荐使用 UUID 或者雪花id作为主键?
作者:Yrion 来源:http://dwz.date/czf4 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键i ...
- easycode不推荐使用_为什么?mysql不推荐使用uuid或者雪花id作为主键?
前言: 在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不 ...
最新文章
- 13、GridView案例
- python实训项目-实验楼Python项目
- 表必须要有主键吗_玄关隔断什么材质好?玄关隔断必须要做吗?
- python excel 数据匹配实现vlookup功能_如何用python实现excel中的vlookup功能?
- A^n=E;则(A*)^n=?
- java 拆箱 类型不对,Java基本类型于对象类型的拆箱和装箱
- 【C/C++】变量的内存分配
- (九)洞悉linux下的Netfilteriptables:网络地址转换原理之DNAT
- Linux学习笔记3 - 目录和文件管理
- 干货十足:一大波好用的Windows软件帮你开路!
- JAVA自动装箱和拆箱功能是把双刃剑
- 自己动手写CPU——寄存器堆、数据存储器(基于FPGA与Verilog)
- LED点阵屏中“鬼影”现象的分析与解决
- 霍尼韦尔和陕西西咸新区签订投资战略协议;雀巢专业餐饮成都客户交流体验中心落成 | 美通企业日报...
- 提高APP冷启动速度小结
- 深度学习之目标检测--Pytorch实战
- 凝思软件冲刺深交所:年营收不足2亿 拟募资7.9亿
- 如何搭建真正能洞悉数据的领导驾驶舱
- PC用PSV游戏下载工具NPS_Browser+本地缓存文件
- zoj 1203 Swordfish
热门文章
- 【邀请函】相约2022中国(南京)软博会,现场见!
- 中缀转后缀表达式、逆波兰表达式、leetcode224、227
- SAP BP 销售分销下售达方描述与客户不一致情况解决
- auto与decltype
- 关于JAVAOO项目
- 开销(Overhead)究竟是什么?
- Last.fm数据集主要属性:artist,album, and track name
- 九耶丨阁瑞钛伦特-大型计算机的操作系统
- 驾驶证理论测试显示软件未激活,驾照理论测试
- oracle数据库扩大表空间,[小技巧]手工扩大Oracle数据库表空间的方法