面试官:如何设计一个订单号生成器?

ops/2024/10/18 9:17:56/

        设计一个订单号生成系统,主要考虑到生成的订单号需要满足的几个要求:唯一性、可扩展性、以及可能的业务相关性。以下是几种常见的解决方案及相应的示例代码:

目录

单号的生成器的几种实现方式:

UUID

时间+随机数/序列

Snowflake ID结构 

特点

下面是对这段代码的解释:

使用场景:

前缀+日期+流水号

1、生成器接口:

2、生成器实现类:

3、客户端更新编码规则(前缀和日期格式)


单号的生成器的几种实现方式:

UUID

        最简单的方法是使用UUID生成唯一的订单号。UUID(Universally Unique Identifier)是一种广泛使用的标识符,由128位组成,通常以32个十六进制数字表示,分为五组,形式为8-4-4-4-12的字符串,例如123e4567-e89b-12d3-a456-426614174000。

UUID全球唯一,实现简单,但缺点是UUID较长,没有任何实质含义不易记忆和存储。

java">public static String generateUUID() {// 生成一个UUIDUUID uuid = UUID.randomUUID();// 将UUID转换为字符串String uuidAsString = uuid.toString();// 返回UUID字符串return uuidAsString;
}

时间+随机数/序列

java">public class OrderNumberGenerator {private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");private static final int RANDOM_NUM_BOUND = 10000; // 定义随机数范围public static String generateOrderNumber(String prefix) {// 生成时间戳部分String timestamp = dateFormat.format(new Date());// 生成随机数部分int randomNumber = ThreadLocalRandom.current().nextInt(RANDOM_NUM_BOUND);// 组合成订单号return prefix + timestamp + String.format("%04d", randomNumber);}}

Snowflake ID结构 

一个 Snowflake ID 通常是一个 64 位的整数,其结构如下:

Timestamp (41 bits)   |   Node ID (10 bits)   |    Sequence (12 bits)   |

  1. Timestamp(时间戳) - 41 位

    • 表示自某个固定时间点(通常是一个纪元,例如 1970 年 1 月 1 日)以来的毫秒数。

    • 可以支持大约 69 年的时间跨度(2^41 毫秒)。

  2. Node ID(节点 ID) - 10 位

    • 用于标识生成 ID 的机器(或节点)。如果系统有多个节点,每个节点都会有一个唯一的 ID。

    • 可以支持最多 1024 个不同的节点(2^10)。

  3. Sequence(序列号) - 12 位

    • 在同一毫秒内生成的 ID 的序列号。每个节点在同一毫秒内可以生成最多 4096 个 ID(2^12)。

    • 序列号每次生成时会递增。

特点


http://www.ppmy.cn/ops/122191.html

相关文章

Codeforces Round 977

这场比赛是晚上vp的,太逆天了自己,给我自己都菜笑了,第二题当时差了一个那个循序渐进的点没想到,关键细节都想到了,当时以为是错的就没写,第二题没做出来确实好久没遇到过了,裂开 话不多说&…

短视频时代,网站建设存在的意义还有多大?

在短视频时代,网站建设的存在意义依然具有多方面的价值和作用。尽管短视频作为一种新兴的传播方式迅速发展并受到广泛欢迎,但网站作为互联网的基础设施之一,仍然在许多领域发挥着不可替代的作用。以下是具体分析: 信息深度与完整性…

WindowsTerminal 美化-壁纸随机更换

目录 一. 相关网址二. 壁纸随机更换思路三. 指定 WindowsTermina 壁纸路径四. 编写脚本,随机替换壁纸4.1 powershell脚本4.2 .bat批处理脚本 四. 配置定时任务,添加触发器五. 效果 一. 相关网址 官方下载 Windows Terminal 官方Github微软商店 美化 Oh …

【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空

【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空 修改表添加字段语法示例注意事项 删除字段语法示例 修改字段使用 MODIFY COLUMN语法示例 使用 CHANGE COLUMN语法示例 重命名表语法示例 删除表语法示例 清空表使用 TRUNCATE TABLE使用 DELETE FROM对比 TRUNC…

Pytorch常见坑(不断更新)

一、基本错误 1、UserWarning: Grad strides do not match bucket view strides. This may indicate grad was not created according to the gradient layout contract, or that the params strides changed since DDP was constructed. This is not an error, but may impa…

异常场景分析

优质博文:IT-BLOG-CN 为了防止黑客从前台异常信息,对系统进行攻击。同时,为了提高用户体验,我们都会都抛出的异常进行拦截处理。 一、异常处理类 Java把异常当做是破坏正常流程的一个事件,当事件发生后,…

Java中TreeMap,HashMap和LinkedHashMap的区别

先决条件:Java 中的 HashMap 和 TreeMap TreeMap、HashMap 和 LinkedHashMap:有什么相似之处? 所有类都提供键->值映射和遍历键的方法。这些类之间最重要的区别是时间保证和键的顺序。 HashMap、TreeMap 和LinkedHashMap三个类都实现了…

51单片机系列-按键检测原理

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 独立按键是检测低电平的。 下面我们来看一张对应的电路原理图: 在这张图当中,P1,P2,P3内部都上拉了电阻,但是P0没有&am…