项目中使用雪花算法id生成工具

您所在的位置:网站首页 雪花算法生成的id可以用int存取吗 项目中使用雪花算法id生成工具

项目中使用雪花算法id生成工具

2024-07-17 07:36:44| 来源: 网络整理| 查看: 265

今天参与新项目,发现项目中使用的是uuid,写一篇优化方案给领导

1、雪花算法id与uuid的对比 雪花算法UUID类型Long字符串占用空间8byte16byte顺序性自增有序无序索引结构影响无影响新增、删除数据会导致索引结构重排序数据库要求mysql官方强烈建议不要使用uuid

首先,使用 UUID 作为主键可能会导致索引性能下降,因为 UUID 是随机生成的字符串,不像自增主键是连续的数字。这可能会导致索引分散在整个表中,而不是集中在一起,从而影响查询性能。

其次,使用 UUID 作为主键可能会导致存储空间的浪费,因为 UUID 是一个较长的字符串,需要更多的存储空间。这可能会影响数据库的性能和可伸缩性,尤其是在处理大型数据集时。

2、项目中整合雪花算法 2.1、hutool工具包中提供了雪花算法生成工具类 2.1.1、在启动类中配置SnowflakeGenerator,将其注册到spring容器中

2.1.2、使用方式

在需要使用的类中,注入SnowflakeGenerator即可食用

生成的id内容:

1632932158878258313 2.2、性能测试

3、数据库主键建议

雪花算法是64位二进制位的大整数,64/8 = 8字节

mysql使用bitint,bigint类型有64位,64/8 = 8字节, 刚好满足

postgresql使用int8, int8一共8字节空间,刚好满足

4、手撸一个雪花算法id生成工具类 import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkInterface; /** * @Author bytesMaster * @Date 2023/3/7 * @Description 雪花算法id生成器 * 雪花id只占8字节空间,体积小,内容为数字,实现有序自增,新增和删除数据,索引结构不需要重排序 * uuid占用16字节空间,体积大, 内容为字符串,无序, 新增和删除数据,索引结构要重排序,额外开销大 */ public class SnowFlakeIdWorker { // 时间起始标记点,作为基准,一般取系统的最近时间(一旦确定不能变动) private final static long twepoch = 1678154396522L; // 机器标识位数 private final static long workerIdBits = 5L; // 数据中心标识位数 private final static long datacenterIdBits = 5L; // 机器ID最大值 private final static long maxWorkerId = -1L ^ (-1L if (workerId > maxWorkerId || workerId throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); } this.workerId = workerId; this.datacenterId = datacenterId; } /** * 获取下一个ID * * @return */ public synchronized long nextId() { long timestamp = timeGen(); // 如果当前时间小于上一次 ID 生成的时间戳,说明发生时钟回拨,为保证ID不重复抛出异常 if (timestamp // 当前毫秒内,则+1 sequence = (sequence + 1) & sequenceMask; if (sequence == 0) { // 当前毫秒内计数满了,则等待下一秒 timestamp = tilNextMillis(lastTimestamp); } } else { sequence = 0L; } lastTimestamp = timestamp; // ID偏移组合生成最终的ID,并返回ID long nextId = ((timestamp - twepoch) timestamp = this.timeGen(); } return timestamp; } private long timeGen() { return System.currentTimeMillis(); } /** * 获取 maxWorkerId */ protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { StringBuffer mpid = new StringBuffer(); mpid.append(datacenterId); String name = ManagementFactory.getRuntimeMXBean().getName(); if (!name.isEmpty()) { /* * GET jvmPid */ mpid.append(name.split("@")[0]); } /* * MAC + PID 的 hashcode 获取16个低位 */ return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); } /** * 数据标识id部分 */ protected static long getDatacenterId(long maxDatacenterId) { long id = 0L; try { InetAddress ip = InetAddress.getLocalHost(); NetworkInterface network = NetworkInterface.getByInetAddress(ip); if (network == null) { id = 1L; } else { byte[] mac = network.getHardwareAddress(); id = ((0x000000FF & (long) mac[mac.length - 1]) | (0x0000FF00 & (((long) mac[mac.length - 2]) 6; id = id % (maxDatacenterId + 1); } } catch (Exception e) { System.out.println(" getDatacenterId: " + e.getMessage()); } return id; } } 5、传输前端后精度丢失

数据库中的id是: 1635196077915246592 前端接收到的是:1635196077915246600 被四舍五入了 在这里插入图片描述

这是因为JS是弱语言,前端接收数字类型参数为number 最大接收长度为16位,超出长度则会丢失精度 而JAVA的Long类型长度为19位,所以传输到前端的后三位精度丢失 所以我们解决该问题的思路就是:把java里的Long类型转换为String返回给前端

在实体类中的id字段加上注解:

@ApiModelProperty(value = "雪花算法生成的主键") @JsonFormat(shape = JsonFormat.Shape.STRING)//此句为问题关键相当于吧Long转换为String @JSONField(serializeUsing = ToStringSerializer.class) //此处标识得在序列化的时候转换为字符串 private Long id;

需要引入:com.fasterxml.jackson.core依赖

返回给前端的id就变成字符串了



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


    图片新闻

    实验室药品柜的特性有哪些
    实验室药品柜是实验室家具的重要组成部分之一,主要
    小学科学实验中有哪些教学
    计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
    实验室各种仪器原理动图讲
    1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
    高中化学常见仪器及实验装
    1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
    微生物操作主要设备和器具
    今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
    浅谈通风柜使用基本常识
     众所周知,通风柜功能中最主要的就是排气功能。在

    专题文章

      CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭