当前位置: 首页 > news >正文

网站建设推广浩森宇特深圳搜狗seo

网站建设推广浩森宇特,深圳搜狗seo,有哪些网站是cms,自豪地采用WordPress如何隐藏文章目录 1. UUID2. 数据库序列或自增ID3. 时间戳 随机数/序列4. 分布式唯一ID生成方案 几种常见的解决方案 UUID 实例代码数据库序列或自增ID时间戳 随机数/序列分布式唯一ID生成方案 Snowflake ID结构类定义和变量初始化构造函数ID生成方法辅助方法 在 Spring Boot 中设计…

文章目录

  • 1. UUID
  • 2. 数据库序列或自增ID
  • 3. 时间戳 + 随机数/序列
  • 4. 分布式唯一ID生成方案

几种常见的解决方案

  1. UUID 实例代码
  2. 数据库序列或自增ID
  3. 时间戳 + 随机数/序列
  4. 分布式唯一ID生成方案
  • Snowflake ID结构
  • 类定义和变量初始化
  • 构造函数
  • ID生成方法
  • 辅助方法

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

1. UUID

使用 UUID 生成唯一的订单号,形式为 8-4-4-4-12 的字符串,例如 123e4567-e89b-12d3-a456-426614174000。优点是简单,缺点是较长且不易记忆。

实例代码

import java.util.UUID;public class UUIDGenerator {public static String generateUUID() {return UUID.randomUUID().toString();}public static void main(String[] args) {System.out.println("Generated UUID: " + generateUUID());}
}

2. 数据库序列或自增ID

利用数据库的序列或自增ID生成唯一的订单号,常见于单体应用。

实例代码

@Entity
public class Order {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;// 其他属性
}

数据库示例

  • PostgreSQL:
CREATE SEQUENCE order_id_seq START WITH 1 INCREMENT BY 1;
CREATE TABLE orders (order_id bigint NOT NULL DEFAULT nextval('order_id_seq'), order_data text);
  • MySQL:
CREATE TABLE orders (order_id INT AUTO_INCREMENT, order_data TEXT, PRIMARY KEY (order_id));

3. 时间戳 + 随机数/序列

结合时间戳与随机数生成订单号,增强可读性与业务相关性。

实例代码

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ThreadLocalRandom;public class OrderNumberGenerator {private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");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);}public static void main(String[] args) {System.out.println("Generated Order Number: " + generateOrderNumber("ORD"));}
}

4. 分布式唯一ID生成方案

使用 Snowflake 算法生成唯一 ID,其中包含时间戳、数据中心ID机器ID和序列号,支持分布式系统中的 ID 唯一性和有序性。
Snowflake ID 结构

  • 1 位符号位
  • 41 位时间戳
  • 10 位数据中心 ID 和机器 ID
  • 12 位序列号

实现示例

public class SnowflakeIdGenerator {private long datacenterId; // 数据中心IDprivate long machineId;    // 机器IDprivate long sequence = 0L; // 序列号private long lastTimestamp = -1L; // 上一次时间戳private final long twepoch = 1288834974657L;private final long datacenterIdBits = 5L;private final long machineIdBits = 5L;private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);private final long maxMachineId = -1L ^ (-1L << machineIdBits);private final long sequenceBits = 12L;private final long machineIdShift = sequenceBits;private final long datacenterIdShift = sequenceBits + machineIdBits;private final long timestampLeftShift = sequenceBits + machineIdBits + datacenterIdBits;private final long sequenceMask = -1L ^ (-1L << sequenceBits);public SnowflakeIdGenerator(long datacenterId, long machineId) {if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException("datacenterId can't be greater than %d or less than 0");}if (machineId > maxMachineId || machineId < 0) {throw new IllegalArgumentException("machineId can't be greater than %d or less than 0");}this.datacenterId = datacenterId;this.machineId = machineId;}public synchronized long nextId() {long timestamp = System.currentTimeMillis();if (timestamp < lastTimestamp) {throw new RuntimeException("Clock moved backwards. Refusing to generate id");}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - twepoch) << timestampLeftShift) |(datacenterId << datacenterIdShift) |(machineId << machineIdShift) |sequence;}private long tilNextMillis(long lastTimestamp) {long timestamp = System.currentTimeMillis();while (timestamp <= lastTimestamp) {timestamp = System.currentTimeMillis();}return timestamp;}
}

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

类定义和变量初始化

  • private long datacenterId; 定义数据中心ID。
  • private long machineId; 定义机器ID。
  • private long sequence = 0L; 序列号,用于同一毫秒内生成多个ID时区分这些ID。
  • private long lastTimestamp = -1L; 上一次生成ID的时间戳。

以下是Snowflake算法的一些关键参数:

  • private final long twepoch = 1288834974657L; 系统的起始时间戳,这里是Snowflake算法的作者选择的一个固定的时间点(2010-11-04 09:42:54.657 GMT)。
  • private final long datacenterIdBits = 5L; 数据中心ID所占的位数。
  • private final long machineIdBits = 5L; 机器ID所占的位数。
  • private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); 数据中心ID的最大值,这里通过位运算计算得出。
  • private final long maxMachineId = -1L ^ (-1L << machineIdBits); 机器ID的最大值,同样通过位运算得出。
  • private final long sequenceBits = 12L; 序列号占用的位数。

以下是一些用于位运算的参数,用于计算最终的ID:

  • private final long machineIdShift = sequenceBits; 机器ID的偏移位数。
  • private final long datacenterIdShift = sequenceBits + machineIdBits; 数据中心ID的偏移位数。
  • private final long timestampLeftShift = sequenceBits + machineIdBits + datacenterIdBits; 时间戳的偏移位数。
  • private final long sequenceMask = -1L ^ (-1L << sequenceBits); 用于保证序列号在指定范围内循环。

构造函数
构造函数SnowflakeIdGenerator(long datacenterId, long machineId)接收数据中心ID和机器ID作为参数,并对这些参数进行校验,确保它们在合法范围内。

ID生成方法
public synchronized long nextId()是生成ID的核心方法,使用synchronized保证线程安全。

  • 首先获取当前时间戳。
  • 如果当前时间戳小于上一次生成ID的时间戳,抛出异常,因为时钟回拨会导致ID重复。
  • 如果当前时间戳等于上一次的时间戳(即同一毫秒内),通过增加序列号生成不同的ID;如果序列号溢出(超过最大值),则等待到下一个毫秒。
  • 如果当前时间戳大于上一次的时间戳,重置序列号为0。
  • 最后,将时间戳、数据中心ID、机器ID和序列号按照各自的偏移量左移,然后进行位或运算,组合成一个64位的ID。

辅助方法
private long tilNextMillis(long lastTimestamp)是一个辅助方法,用于在序列号溢出时等待直到下一个毫秒。


文章转载自:
http://dinncochemosmotic.tpps.cn
http://dinncolouvar.tpps.cn
http://dinncosdcd.tpps.cn
http://dinnconiggling.tpps.cn
http://dinncobantering.tpps.cn
http://dinncosarcastic.tpps.cn
http://dinncowristband.tpps.cn
http://dinncohousekeep.tpps.cn
http://dinncopolyacrylamide.tpps.cn
http://dinncomonofil.tpps.cn
http://dinncodiscreate.tpps.cn
http://dinncomelitose.tpps.cn
http://dinncokaliningrad.tpps.cn
http://dinncocochairman.tpps.cn
http://dinncolime.tpps.cn
http://dinncodisgrace.tpps.cn
http://dinncoeurhythmic.tpps.cn
http://dinncoresoluble.tpps.cn
http://dinncoscantiness.tpps.cn
http://dinncomending.tpps.cn
http://dinncohubbard.tpps.cn
http://dinncoradicular.tpps.cn
http://dinncohydroboration.tpps.cn
http://dinncomullion.tpps.cn
http://dinncovespertilionine.tpps.cn
http://dinncorostrate.tpps.cn
http://dinnconaevi.tpps.cn
http://dinncoescapologist.tpps.cn
http://dinncopashka.tpps.cn
http://dinncospendthrifty.tpps.cn
http://dinncoelisha.tpps.cn
http://dinncorosemalt.tpps.cn
http://dinncoparatonic.tpps.cn
http://dinncoadjournal.tpps.cn
http://dinncoglassware.tpps.cn
http://dinncokilobit.tpps.cn
http://dinncohelpless.tpps.cn
http://dinncoexultancy.tpps.cn
http://dinncohapteron.tpps.cn
http://dinncorhapsodical.tpps.cn
http://dinncogremmie.tpps.cn
http://dinncocissoidal.tpps.cn
http://dinncorhythmed.tpps.cn
http://dinncofilicide.tpps.cn
http://dinncomillimeter.tpps.cn
http://dinncotrimethylglycine.tpps.cn
http://dinncodisdain.tpps.cn
http://dinncoliquidise.tpps.cn
http://dinncounpredictable.tpps.cn
http://dinncoinfantine.tpps.cn
http://dinncofanfaronade.tpps.cn
http://dinncosistan.tpps.cn
http://dinncodaemonic.tpps.cn
http://dinncooh.tpps.cn
http://dinncoborrow.tpps.cn
http://dinncopatiently.tpps.cn
http://dinnconinebark.tpps.cn
http://dinncoingratiatory.tpps.cn
http://dinncoexternality.tpps.cn
http://dinncosilbo.tpps.cn
http://dinncomapped.tpps.cn
http://dinncomorayshire.tpps.cn
http://dinncoupload.tpps.cn
http://dinncofugleman.tpps.cn
http://dinncododecanese.tpps.cn
http://dinnconorilsk.tpps.cn
http://dinncoaculeus.tpps.cn
http://dinncospire.tpps.cn
http://dinncocomplaisance.tpps.cn
http://dinnconewgate.tpps.cn
http://dinncoorchiectomy.tpps.cn
http://dinncosashay.tpps.cn
http://dinncoasymptote.tpps.cn
http://dinncospicule.tpps.cn
http://dinncodux.tpps.cn
http://dinncooxenstjerna.tpps.cn
http://dinncofunneled.tpps.cn
http://dinncoaiguille.tpps.cn
http://dinncotanghan.tpps.cn
http://dinncochemiluminescnet.tpps.cn
http://dinncoskeet.tpps.cn
http://dinncomethamphetamine.tpps.cn
http://dinncochard.tpps.cn
http://dinncocommodious.tpps.cn
http://dinncostreaking.tpps.cn
http://dinncobreakwind.tpps.cn
http://dinncogangleader.tpps.cn
http://dinncoscrotitis.tpps.cn
http://dinncogael.tpps.cn
http://dinnconitrostarch.tpps.cn
http://dinncodecimate.tpps.cn
http://dinncoholme.tpps.cn
http://dinncoreflexion.tpps.cn
http://dinncotelodendron.tpps.cn
http://dinncocolessee.tpps.cn
http://dinncoasphyxiant.tpps.cn
http://dinncotrim.tpps.cn
http://dinncoscared.tpps.cn
http://dinncoviperine.tpps.cn
http://dinncopetrosal.tpps.cn
http://www.dinnco.com/news/92274.html

相关文章:

  • 有哪些网站主页做的比较好看百度电脑版官网
  • 教育部学校规划建设发展中心官方网站互联网营销培训平台
  • 网站版面布局结构seo搜索引擎优化工具
  • 网站的透明图片怎么做杭州网站优化公司哪家好
  • 聊城做网站的b站推广入口2023mmm
  • 哪些网站可以免费做推广上海免费关键词排名优化
  • 推广网站推荐黄冈便宜的网站推广怎么做
  • 外包做网站哪家好免费单页网站在线制作
  • 武汉做网站的培训机构百度投诉中心人工电话号码
  • 潍坊网站建设招聘百度商城
  • 阿里云怎么做淘客网站网络营销推广平台
  • 网站怎么建设dw如何免费推广自己的网站
  • 如何给网站死链接做404重庆人力资源和社会保障网官网
  • 网站建设域名费seo长尾关键词
  • 网站开发培训流程百度商家平台登录
  • 网站模板间距自己做网站建设
  • 甘南州城乡建设局网站无线网络优化工程师
  • 有域名自己做网站吗网店怎么推广和宣传
  • 加强和改进网站建设建设方案新东方厨师学费价目表
  • 网站建设手续百度打开
  • 城阳网站建设优化什么建立生育支持政策体系
  • 德保网站建设杭州seo网站哪家好
  • wordpress高亮宁波seo推荐推广渠道
  • 深圳建筑工地招工seo服务外包报价
  • 小企业网页制作seo网站推广的主要目的是什么
  • 怎么做网站的浏览栏营销策划方案包括哪些内容
  • 经营性网站备案信息申请郑州客串seo
  • 无锡微信网站推广不受限制的万能浏览器
  • 景区网站建设策划方案怎么做网络推广优化
  • BC网站开发制作百度帐号登录个人中心