`

Mysql 全局ID的实现

 
阅读更多

工作中需要一个全局的自增的主键ID,网上找到一种mysql的实现方式(redis考虑到现在集群的不稳定和持久化的问题,暂时没有考虑那种方案)

网上方案如下:

因为MySQL本身支持auto_increment操作,很自然地,我们会想到借助这个特性来实现这个功能。Flicker在解决全局ID生成方案里就采用了MySQL自增长ID的机制(auto_increment + replace into + MyISAM)。一个生成64位ID方案具体就是这样的:
先创建单独的数据库(eg:ticket),然后创建一个表:

CREATE TABLE Tickets64 (
            id bigint(20) unsigned NOT NULL auto_increment,
            stub char(1) NOT NULL default '',
            PRIMARY KEY  (id),
            UNIQUE KEY stub (stub)
    ) ENGINE=MyISAM


当我们插入记录后,执行SELECT * from Tickets64,查询结果就是这样的:

+-------------------+------+
| id                | stub |
+-------------------+------+
| 72157623227190423 |    a |
+-------------------+------+

在我们的应用端需要做下面这两个操作,在一个事务会话里提交:

REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();

这样我们就能拿到不断增长且不重复的ID了。
到上面为止,我们只是在单台数据库上生成ID,从高可用角度考虑,接下来就要解决单点故障问题:Flicker启用了两台数据库服务器来生成ID,通过区分auto_increment的起始值和步长来生成奇偶数的ID。

TicketServer1:
auto-increment-increment = 2
auto-increment-offset = 1

TicketServer2:
auto-increment-increment = 2
auto-increment-offset = 2

 

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

最后,在客户端只需要通过轮询方式取ID就可以了。
优点:充分借助数据库的自增ID机制,提供高可靠性,生成的ID有序。
缺点:占用两个独立的MySQL实例,有些浪费资源,成本较高。
首先,测试了下这个方案是可行的,多线程的情况下没有出现ID重复的情况
接着谈一下我的理解  也不知道对不对
1) 表设计
主键自增,stub唯一索引,这样每做一次replace操作,主键就会自增一次
2)存储引擎的选择MyISAM,主要是考虑到表锁的情况
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?--> 对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
3)同一个事物会话里提交
刚开始还纠结了很久,因为MyISAM是不支持事务的。在这里的主要作用应该是保证LAST_INSERT_ID() 产生最近更新记录 auto_increment 并且是本次连接, 不受其他连接的影响
<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->
 
 
 
 
 

 

分享到:
评论

相关推荐

    Mysql全局ID生成方法

    既然要sharding,那么不可避免的要讨论到sharding key问题,在有些业务系统中,必须保证sharding key全局唯一,比如存放商品的数据库等,那么如何生成全局唯一的ID呢,下文将从DBA的角度介绍几种常见的方案。...

    mysql雪花算法生成唯一整型ID主键的实现方法

    MySQL 雪花算法生成唯一整型ID主键的实现主要针对大数据环境下,需要大量生成全局唯一ID的需求。雪花算法是一种分布式ID生成策略,由Twitter开源,其设计目标是在分布式系统中生成具有全局唯一性、有序性和高并发性...

    利用mysql实现的雪花算法案例

    总结,MySQL实现的雪花算法能够有效解决分布式系统中的ID生成问题,通过巧妙地结合时间戳、节点标识和序列号,既保证了ID的全局唯一性,又确保了高并发下的生成效率。尽管存在时间回拨的潜在风险,但通过合理的策略...

    一种简单的ID生成策略: Mysql表生成全局唯一ID的实现

    生成全局ID的方法很多, 这里记录下一种简单的方案: 利用mysql的自增id生成全局唯一ID. 1. 创建一张只需要两个字段的表: CREATE TABLE `guid` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `stub` char(1...

    全局唯一ID生成

    除此之外,还有一种基于分布式数据库的解决方案,如MySQL的UUID函数,它可以生成128位的UUID,保证全局唯一。但UUID的字符串形式较长,可能不适合某些需要节省存储空间的场景。 另一种流行的分布式ID生成器是...

    Go-GoMySQL实现的ID生成服务

    总结来说,Go-GoMySQL实现的ID生成服务是一个高效、可靠的解决方案,它利用Go语言的并发能力,结合MySQL的持久化特性,实现了分布式环境下的全局唯一ID生成。通过HTTP接口提供服务,易于与其他系统集成,同时通过...

    易语言初步连接MYSQL数据实现搜索和修改的原码

    在本教程中,我们将探讨如何使用易语言初步连接MYSQL数据库,并实现数据的搜索和修改功能。这些基本操作对于任何数据库应用程序都是至关重要的,无论是简单的管理工具还是复杂的业务系统。 首先,我们需要了解如何...

    如何在两台MySQL数据库间实现同步

    在开发环境中,有时需要在两台MySQL数据库之间实现数据同步,以确保数据的一致性和冗余。本教程将详细介绍如何在两台运行相同系统(FreeBSD 5.4)和软件(Apache 2.0.55、PHP 4.4.0、MySQL 4.1.15)的服务器上配置...

    Python3 操作 MySQL 插入一条数据并返回主键 id的实例

    在Python3中操作MySQL数据库并插入一条数据,然后获取并返回这条...通过上述步骤,可以完整地实现使用Python3插入MySQL数据库数据并获取插入数据的主键id的功能,这对于数据库编程和数据管理都是非常重要的操作技能。

    Go-GolangMysql实现的分布式ID生成服务

    总结,利用Go和MySQL实现分布式ID生成服务需要考虑全局唯一性、顺序性和性能。在设计时,可以参考Snowflake算法或采用MySQL自增ID结合分布式锁的方式,结合Go的并发特性来提高服务的可扩展性和效率。`go-id-alloc-...

    全局自增ID设计方案

    MYCAT是一款开源的数据库中间件,它提供多种方式来实现全局自增ID的生成。 1. **本地文件实现**:这种方式简单易行,但在分布式环境下容易出现问题,例如重新发布或不同实例间无法保证全局递增性。 2. **基于...

    利用mysql事务特性实现并发安全的自增ID示例

    本篇将详细介绍如何利用MySQL的事务特性来实现并发安全的自增ID,这对于需要全局唯一ID的大型项目来说至关重要。 首先,自增ID通常用于创建唯一标识,例如用户ID(uid)。当用户数量庞大,需要进行分表存储时,简单...

    实现mysql同步文档

    同时,设置`server-id`以区分不同的MySQL实例,并配置`master-connect-retry`来设定重试连接Master的时间间隔。 3. **配置Master服务器**: Master服务器需要开启二进制日志功能,即设置`log-bin`,并指定日志文件...

    PHP+mysql功能实现BBS基本功能

    - **表单处理**:通过`$_POST`和`$_GET`全局数组获取表单提交的数据。 2. **MySQL基础** - **数据库和表**:MySQL中,数据存储在数据库中,数据库由多个表组成。每个表包含一系列列,列定义了数据类型和约束。 -...

    50_一个关键的问题!分库分表之后全局id咋生成?.zip

    分库分表之后全局id咋生成?”中被明确提出。下面将详细探讨这个问题及其解决方案。 分库分表后,由于数据不再集中存储,传统的自增ID策略将无法满足全局唯一性需求。每个表或每个库可能会有自己的自增序列,导致ID...

    JSP+Servlet+MySql实现商城项目

    本项目基于JSP、Servlet和MySQL技术实现了在线商城的功能,这是一套完整的电商系统开发案例,适合初学者和有一定经验的开发者学习。在本文中,我们将深入探讨这三个核心技术在电商项目中的应用,以及它们如何协同...

    mysql字段加密

    MySQL 字段加密是将数据库字段类型设置为 varbinary 类型,并将加密盐设置为全局变量,以实现对敏感数据的保护。本文将详细介绍 MySQL 字段加密的实现步骤和相关知识点。 数据库字段类型 在 MySQL 中,将要加密的...

    php+mysql+js拖拽div实例

    1. **创建数据库表**:在MySQL中创建一个表来存储Div的位置信息,如`positions`,包含`id`(主键)、`div_id`(Div的唯一标识)和`position`(JSON格式的坐标信息)字段。 ```sql CREATE TABLE positions ( id INT...

Global site tag (gtag.js) - Google Analytics