数据库ID生成策略及相应的代码示例(优缺点)

2024-05-16 01:28

本文主要是介绍数据库ID生成策略及相应的代码示例(优缺点),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下是各大厂常用的数据库ID生成策略及相应的代码示例:

1. 自增ID(Auto Increment)

适用于单机数据库,如MySQL、PostgreSQL。
  • 应用场景:主要用于单机数据库,如MySQL、PostgreSQL。
  • 优点:简单易用,性能较好。
  • 缺点:在分布式环境下难以保证唯一性和顺序性,需要额外处理。
MySQL示例:
CREATE TABLE example (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL
);

2. UUID(Universally Unique Identifier)

适用于需要全局唯一标识的场景。
  • 应用场景:适用于需要全局唯一标识的场景。
  • 优点:可以保证全局唯一性,适合分布式系统。
  • 缺点:长度较长,占用存储空间较大,索引性能较差。
Java示例:
import java.util.UUID;public class UUIDExample {public static void main(String[] args) {UUID uniqueID = UUID.randomUUID();System.out.println(uniqueID);}
}

3. 雪花算法(Snowflake Algorithm)

适用于高并发的分布式系统,Twitter开源的分布式ID生成算法
  • 应用场景:Twitter开源的分布式ID生成算法,适用于高并发场景。
  • 优点:生成的ID有序且唯一,适合分布式环境,性能好。
  • 缺点:需要部署额外的ID生成服务。
Java示例:
public class SnowflakeIdGenerator {private final long epoch = 1288834974657L;private final long workerIdBits = 5L;private final long datacenterIdBits = 5L;private final long maxWorkerId = -1L ^ (-1L << workerIdBits);private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);private final long sequenceBits = 12L;private final long workerIdShift = sequenceBits;private final long datacenterIdShift = sequenceBits + workerIdBits;private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;private final long sequenceMask = -1L ^ (-1L << sequenceBits);private long workerId;private long datacenterId;private long sequence = 0L;private long lastTimestamp = -1L;public SnowflakeIdGenerator(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - epoch) << timestampLeftShift) |(datacenterId << datacenterIdShift) |(workerId << workerIdShift) |sequence;}protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}protected long timeGen() {return System.currentTimeMillis();}
}

4. 数据库分配ID(Database Assigned IDs)

利用数据库的序列号生成功能,如Oracle的Sequence。
  • 应用场景:利用数据库的序列号生成功能,如Oracle的Sequence。
  • 优点:数据库自身保证唯一性和有序性。
  • 缺点:可能成为系统瓶颈,不适用于大规模分布式系统。
Oracle示例:CREATE SEQUENCE example_seq START WITH 1 INCREMENT BY 1;CREATE TABLE example (id NUMBER PRIMARY KEY,name VARCHAR2(255) NOT NULL
);INSERT INTO example (id, name) VALUES (example_seq.NEXTVAL, 'example_name');

5. Redis生成ID

利用Redis的原子自增操作来生成唯一ID。
  • 应用场景:利用Redis的原子自增操作来生成唯一ID。
  • 优点:高性能,适合高并发环境。
  • 缺点:需要维护Redis集群,存在单点故障风险。
Java示例(使用Jedis库):import redis.clients.jedis.Jedis;public class RedisIdGenerator {private Jedis jedis;private String key;public RedisIdGenerator(String host, int port, String key) {this.jedis = new Jedis(host, port);this.key = key;}public long nextId() {return jedis.incr(key);}public static void main(String[] args) {RedisIdGenerator generator = new RedisIdGenerator("localhost", 6379, "unique_id");System.out.println(generator.nextId());}
}

6. Leaf(美团的分布式ID生成服务)

美团开源的分布式ID生成服务。
  • 应用场景:美团开源的分布式ID生成服务。
  • 优点:适合大规模分布式系统,生成的ID有序且唯一。
  • 缺点:复杂性较高,需要部署和维护Leaf服务。
Leaf使用示例:
Leaf服务需要先进行配置和部署,以下是基本的使用方式:import com.sankuai.inf.leaf.common.Result;
import com.sankuai.inf.leaf.snowflake.IDGen;public class LeafIdGenerator {private IDGen idGen;public LeafIdGenerator(IDGen idGen) {this.idGen = idGen;}public long nextId() {Result result = idGen.get("");if (result.getStatus() == Status.SUCCESS) {return result.getId();} else {throw new RuntimeException("Failed to generate ID");}}
}
要使用Leaf,需要先部署Leaf服务,并通过配置文件或Zookeeper进行配置。

这篇关于数据库ID生成策略及相应的代码示例(优缺点)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993479

相关文章

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

虚拟机Centos7安装MySQL数据库实践

《虚拟机Centos7安装MySQL数据库实践》用户分享在虚拟机安装MySQL的全过程及常见问题解决方案,包括处理GPG密钥、修改密码策略、配置远程访问权限及防火墙设置,最终通过关闭防火墙和停止Net... 目录安装mysql数据库下载wget命令下载MySQL安装包安装MySQL安装MySQL服务安装完成

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每