工程化的项目中使用什么作为唯一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类型,还可以取模使用。


分享:


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


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


相关文章
|
13天前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
57 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
1月前
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
57 26
|
3月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
102 8
|
3月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
280 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
3月前
|
前端开发 JavaScript 测试技术
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
55 3
|
3月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
88 6
|
3月前
|
存储 前端开发 数据可视化
在实际项目中,如何选择使用 Flux 架构或传统的 MVC 架构
在实际项目中选择使用Flux架构或传统MVC架构时,需考虑项目复杂度、团队熟悉度和性能需求。Flux适合大型、高并发应用,MVC则适用于中小型、逻辑简单的项目。
|
4月前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
73 2
|
4月前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益
|
4月前
|
前端开发 JavaScript 测试技术
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
67 0

热门文章

最新文章