线程安全的ID生成器

介绍一个改造升级版本的雪花算法ID生成器,

优点是线程安全的,并且永远不可能出现重复ID。放心使用。

目前网上流行的ID生成器,在for循环里,或者多线程的时候会出现重复。

介绍一个新出炉的开源ID生成器,完美解决这个问题。

示例源码地址:GitHub - geektcp/example-id-generator

 核心是thy-core依赖包里面的IdGenerator类的getId方法,不传参数就直接使用,也可以传参数进一步细分。

另外在spring的entity类的主键上加入注解,自动生成。

在for循环或者多线程环境下任意使用都不会有问题。

package com.geektcp.id;

import com.geektcp.common.mosheh.generator.IdGenerator;

public class App {
    public static void main(String[] args) {
        base();
        singleGen();
        multiThread();
    }


    private static void base() {
        long a = 0;
        String c = null;

        a = IdGenerator.getId();
        System.out.println(a);
        a = IdGenerator.getId(1, 3);

        System.out.println(a);
        IdGenerator.setSplit("/");
        c = IdGenerator.getId("PRE");

        System.out.println(c);
        IdGenerator.setInstance(10, 0);

        a = IdGenerator.getId();

        System.out.println(a);
    }


    private static void singleGen() {
        for (int i = 0; i < 100; i++) {
            System.out.println(IdGenerator.getId());
        }
    }

    private static void multiThread() {
        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println(IdGenerator.getId("A"));
            }
        }, "A").start();

        new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println(IdGenerator.getId("B"));
            }
        }, "A").start();

    }


}

java依赖包,直接在maven官方仓库搜索thy-core

https://mvnrepository.com/artifact/com.geektcp.common

这里采用

1.0.0.RELEASE

最新版本即可。

<dependencies>
        <!-- https://mvnrepository.com/artifact/com.geektcp.common/thy-core -->
        <dependency>
            <groupId>com.geektcp.common</groupId>
            <artifactId>mosheh</artifactId>
            <version>1.0.3</version>
        </dependency>
</dependencies>

打印结果:

1069366794495500288

1069366794499694592

PRE/1069366794503888896

1069366794503888897

1069366794503888898

1069366794503888899

1069366794503888900

1069366794503888901

1069366794503888902

1069366794503888913

1069366794503888914

1069366794503888915

1069366794520666134

1069366794520666135

1069366794520666136

1069366794520666137

1069366794520666138

1069366794520666139

1069366794520666140

1069366794520666141

1069366794520666142

1069366794520666143

1069366794520666144

A/1069366795044954112

A/1069366795044954113

A/1069366795053342723

A/1069366795053342725

A/1069366795053342726

A/1069366795053342727

A/1069366795053342728

A/1069366795057537024

A/1069366795057537025

A/1069366795057537034

A/1069366795057537035

A/1069366795057537036

A/1069366795057537037

A/1069366795057537038

A/1069366795057537039

A/1069366795057537040

B/1069366795053342724

B/1069366795070119936

B/1069366795070119937

B/1069366795070119938

B/1069366795070119939

B/1069366795070119940

B/1069366795070119941

B/1069366795070119942

B/1069366795070119943

B/1069366795070119944

B/1069366795070119945

B/1069366795070119946

B/1069366795070119947

B/1069366795070119965

B/1069366795070119966

B/1069366795070119967

B/1069366795070119968

B/1069366795070119969

B/1069366795074314240

B/1069366795074314241

B/1069366795074314242

B/1069366795074314243

B/1069366795074314244

B/1069366795078508559

B/1069366795078508560

B/1069366795082702851

A/1069366795095285798

A/1069366795095285799

A/1069366795095285800

A/1069366795095285801

A/1069366795116257280

A/1069366795116257281

A/1069366795116257282

A/1069366795116257283

A/1069366795116257284

A/1069366795116257285

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Python 中,可以使用 `uuid` 模块来生成唯一的 ID。UUID 是通用唯一标识符的缩写,可以用于标识信息的唯一性。 使用 `uuid` 模块生成 UUID 可以使用以下代码: ```python import uuid # 生成一个随机的 UUID id = uuid.uuid4() print(id) ``` 这将生成一个类似于 `d55a00cc-6e18-4a10-9f3d-1a710d4c3abc` 的字符串,作为唯一的 ID。 如果需要将这个 ID 存储到数据库中,可以将其转换为字符串再存储。例如,如果使用 SQLite 数据库,可以使用以下代码创建一个表并插入一个新的 UUID: ```python import sqlite3 import uuid # 连接到数据库并创建一个表 conn = sqlite3.connect('test.db') c = conn.cursor() c.execute('''CREATE TABLE test (id text)''') # 生成一个随机的 UUID 并插入到数据库中 id = uuid.uuid4() c.execute("INSERT INTO test VALUES (?)", (str(id),)) # 提交更改并关闭连接 conn.commit() conn.close() ``` 这将在数据库中创建一个名为 `test` 的表,并将一个新的 UUID 插入到 `id` 列中。 ### 回答2: Python 数据库 ID 生成器可以通过不同的方式实现。下面是一个简单的示例: ```python import sqlite3 import uuid def generate_id(): # 连接到 SQLite 数据库 conn = sqlite3.connect('your_database.db') cursor = conn.cursor() # 创建 ID 表,如果不存在 cursor.execute('CREATE TABLE IF NOT EXISTS ids (id TEXT)') # 生成唯一的 ID new_id = uuid.uuid4().hex # 添加 ID 到数据库 cursor.execute('INSERT INTO ids VALUES (?)', (new_id,)) # 提交事务并关闭连接 conn.commit() conn.close() return new_id # 生成一个新的 ID new_id = generate_id() print(new_id) ``` 上述代码使用 SQLite3 数据库作为示例,通过uuid模块生成一个唯一的 ID,并将其存储到名为 "ids" 的表中。你可以将代码适配到你所使用的其他数据库,如MySQL或PostgreSQL。 这个生成器每次调用 `generate_id()` 函数时,都会生成一个新的唯一 ID,并将其保存到数据库中。你可以根据需要将生成的 ID 用于其他功能,如创建用户、产品或其他实体的数据库记录。 ### 回答3: Python 数据库id生成器可以使用各种方法来生成唯一的id,常见的方法有自增长、UUID和雪花算法。 1. 自增长:使用自增长方式生成id是比较简单和常见的方式。在数据库中创建一个自增长字段,每次插入数据时,自动递增并赋予唯一的id值。可以使用Python的数据库操作模块(如MySQLdb、psycopg2等)连接数据库,并执行插入操作以生成id。缺点是只能生成整数型的id。 2. UUID:UUID(Universally Unique Identifier)是一种128位长度的唯一标识符。Python内置了uuid模块,可以使用uuid.uuid4()方法来生成一个随机的UUID。UUID不依赖于数据库的自增长特性,因此可以在任何情况下生成唯一的id,且长度固定。但是UUID的字符串格式比较长,不易于人类识别。 3. 雪花算法:雪花算法是Twitter开源的一种全局唯一ID生成算法,可以在分布式系统中生成唯一的64位id。雪花算法的id由时间戳、机器ID、数据中心ID和自增序列构成。在Python中可以使用Snowflake库来实现雪花算法,该库提供了雪花算法的实现和基于多线程的高并发处理。 在使用数据库id生成器时,需根据具体需求选择适合的方法。自增长优点是简单易用,但在分布式环境下可能会产生冲突;UUID优点是生成唯一id,但字符串较长;雪花算法适用于分布式系统,但需要考虑机器ID和数据中心ID的配置。根据具体情况选择合适的方法能够满足需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值