工程化的项目中使用什么作为唯一ID(附代码) | 架构篇

简介: 工程化的项目中使用什么作为唯一ID(附代码) | 架构篇工程化的项目中使用什么作为唯一ID(附代码) | 架构篇

前言

在项目工程中我们常常会遇到需要标识某种行为、某种操作、某个工单,从头到尾的串联起来。这个时候,我们在实际工作中会用到唯一ID概念。唯一ID要具有唯一性,不可重复,那么在实际工作中我们应该怎么选择我们的唯一ID呢?


以下我会列举几类唯一ID,并附上代码实现。会简单的说一下唯一ID的使用场景。

环境依赖

先在代码中加个依赖,主要演示语言为Java。


   

<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.15</version>
        </dependency>

唯一ID

uuid

使用uuid作为唯一ID, UUID 含义是通用唯一识别码 (Universally Unique Identifier),这是一个软件建构的标准。uuid的组成有3个部分当前日期和时间、时钟序列、全局唯一的IEEE机器识别号。


代码实现:


public static void getUuid() {
    System.out.println("uuid:" + IdUtil.simpleUUID());
  }

结果如下:


image.png


uuid作为唯一ID虽然不会重复,作为分布式系统中的唯一ID也可以。只是uuid比较长,而且没有什么属性信息。一些比较临时数据和业务的场景,采用uuid是没什么问题的。


雪花算法

目前雪花算法生成的ID已经慢慢成为趋势,它是一个64bit大小的整数,主要结构图如下:


image.png


代码实现:


package com.huyi.csdn.tools;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import java.util.Random;
/**
 * @Program: csdn @ClassName: IdDemo @Author: huyi @Date: 2021-12-08 21:16 @Description:
 * 唯一id @Version: V1.0
 */
public class IdDemo {
  public static final Snowflake snowFlake = new Snowflake(1, 2);
  private static Random random = new Random();
  public static void getSnowFlake() {
    Long uid = null;
    for (int i = 0; i < random.nextInt(2) + 1; i++) {
      uid = snowFlake.nextId();
    }
    System.out.println("snowflake:" + uid);
  }
  public static void main(String[] args) {
    getSnowFlake();
  }
}

看下结果:


image.png


代码部分为什么需要使用随机取nextId呢?主要是因为避免一直为偶数。雪花算法生成的ID除了唯一性的好处之外,还具有自增性。所以雪花ID易于存在数据库中,在内存中性能也挺好的。所以博主也非常推荐在工作项目中使用雪花id。


ObjectId

ObjectId是MongoDB数据库的一种唯一ID生成策略,它是UUID version1的变种。


代码实现:


public static void getObjectId() {
    System.out.println("objectId:" + IdUtil.objectId());
  }

看下结果:

image.png



优点是比uuid短一些,使用场景基本和uuid一致。


时间戳

精确到毫秒的时间戳其实还是会有不唯一的可能,但是它具备其他唯一ID不具备的属性特性。可以在查看日志的时候,通过时间戳判断该业务或者工单的发起时间。


代码实现:


public static void getTimestamp() {
    System.out.println("timestamp:" + System.currentTimeMillis());
  }

看下结果:


image.png


在高并发的场景下,不建议使用时间戳作为ID,可以考虑和其他唯一ID做组合,让ID具备时间属性。


完整代码

package com.huyi.csdn.tools;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import java.util.Random;
/**
 * @Program: csdn @ClassName: IdDemo @Author: huyi @Date: 2021-12-08 21:16 @Description:
 * 唯一id @Version: V1.0
 */
public class IdDemo {
  public static final Snowflake snowFlake = new Snowflake(1, 2);
  private static Random random = new Random();
  public static void getUuid() {
    System.out.println("uuid:" + IdUtil.simpleUUID());
  }
  public static void getSnowFlake() {
    Long uid = null;
    for (int i = 0; i < random.nextInt(2) + 1; i++) {
      uid = snowFlake.nextId();
    }
    System.out.println("snowflake:" + uid);
  }
  public static void getObjectId() {
    System.out.println("objectId:" + IdUtil.objectId());
  }
  public static void getTimestamp() {
    System.out.println("timestamp:" + System.currentTimeMillis());
  }
  public static void main(String[] args) {
    getUuid();
    getSnowFlake();
    getObjectId();
    getTimestamp();
  }
}

总结

唯一ID的使用还是需要看具体的场景,主要还是推荐雪花算法,作为long类型,还可以取模使用。


分享:


       无论如何思念,也有些东西终究无法企及,那么,忘了就好。——《夏目友人帐》


如果本文对你有帮助的话,给个赞吧,谢谢!


相关文章
|
消息中间件 监控 前端开发
如何开发项目管理系统中的项目结项板块?(附架构图+流程图+代码参考)
在企业项目管理中,“项目结项”是关键环节,常因流程不清、文档不全、审批滞后等问题导致交付困难。本文介绍如何通过“项目结项”模块实现线上化管理,涵盖结项申请、审批流程、成果上传、权限控制等功能,帮助团队高效完成项目收尾,避免成果丢失与流程混乱。内容包括功能设计、业务流程、系统架构、数据库设计、核心代码实现、前端交互及优化建议,助力项目管理系统快速落地并稳定运行。
|
数据挖掘 项目管理 Python
如何开发项目管理系统中的项目启动板块?(附架构图+流程图+代码参考)
本文介绍了项目管理系统中“项目启动”板块的设计与实现,涵盖功能模块、业务流程、开发技巧及效果展示,并提供代码参考和常见问题解答,助力企业高效搭建项目管理平台。
|
人工智能 自然语言处理 JavaScript
Github又一AI黑科技项目,打造全栈架构,只需一个统一框架?
Motia 是一款现代化后端框架,融合 API 接口、后台任务、事件系统与 AI Agent,支持 JavaScript、TypeScript、Python 多语言协同开发。它提供可视化 Workbench、自动观测追踪、零配置部署等功能,帮助开发者高效构建事件驱动的工作流,显著降低部署与运维成本,提升 AI 项目落地效率。
998 0
|
缓存 Java 数据库
Java 项目分层架构实操指南及长尾关键词优化方案
本指南详解基于Spring Boot与Spring Cloud的Java微服务分层架构,以用户管理系统为例,涵盖技术选型、核心代码实现、服务治理及部署实践,助力掌握现代化Java企业级开发方案。
578 2
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
938 0
|
设计模式 开发者
一、HarmonyOS Next 开发者手册项目之项目架构设计
该项目是一个基于HarmonyOS Next的开发者学习手册应用,旨在帮助开发者系统学习HarmonyOS开发知识。项目采用分级学习方式,从基础到高级逐步深入讲解技术与实践案例。前四章重点介绍应用架构相关内容,助力快速掌握应用核心。 项目结构清晰,包含主入口、源代码目录、公共资源和工具等。页面导航分为多个阶段:萌新小白(基础入门)、登堂入室(进阶学习)、进阶高手(高级开发)。支持Markdown解析,使用`@luvi/lv-markdown-in`插件展示内容,并定义了多种数据结构以规范开发流程。 源码已开源,持续更新中
374 1
|
监控 前端开发 BI
如何开发项目管理系统中的项目收支板块?(附架构图+流程图+代码参考)
本文深入讲解项目管理系统中项目收支模块的设计与实现,涵盖预算、收入与支出管理,以及报表分析功能。内容包括模块功能概述、业务流程、开发技巧与实现方法,并提供数据库设计及前后端代码示例,助力企业打造高效的项目财务管控系统。
|
SQL 前端开发 项目管理
如何开发项目管理系统中的项目执行板块?(附架构图+流程图+代码参考)
随着企业项目规模扩大,传统管理方式已难以满足需求。本文介绍项目管理系统中“项目执行”板块的开发,涵盖任务管理、创建、验收及进度汇报等核心环节。通过功能设计、业务流程和开发技巧,结合代码示例,帮助企业高效推进项目执行,提升管理效率。
|
存储 数据采集 机器学习/深度学习
新闻聚合项目:多源异构数据的采集与存储架构
本文探讨了新闻聚合项目中数据采集的技术挑战与解决方案,指出单纯依赖抓取技术存在局限性。通过代理IP、Cookie和User-Agent的精细设置,可有效提高采集策略;但多源异构数据的清洗与存储同样关键,需结合智能化算法处理语义差异。正反方围绕技术手段的有效性和局限性展开讨论,最终强调综合运用代理技术与智能数据处理的重要性。未来,随着机器学习和自然语言处理的发展,新闻聚合将实现更高效的热点捕捉与信息传播。附带的代码示例展示了如何从多个中文新闻网站抓取数据并统计热点关键词。
844 2
新闻聚合项目:多源异构数据的采集与存储架构
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
1478 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战