Mysql全局ID生成方法

2019-01-04 17:41:28王振洲

代码如下:

function next_id($name){ try{ return $this->next_id_redis($name); } catch(Exception $e){ return $this->next_id_db($name); } }

4、Flicker的解决方案

因为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

最后,在客户端只需要通过轮询方式取ID就可以了。

 •优点:充分借助数据库的自增ID机制,提供高可靠性,生成的ID有序。

 •缺点:占用两个独立的MySQL实例,有些浪费资源,成本较高。

以上内容是小编给大家分享的Mysql全局ID生成方法,希望大家喜欢。

您可能感兴趣的文章:

mysql生成指定位数的随机数及批量生成随机数的方法Linux 下mysql通过存储过程实现批量生成记录mysql 动态生成测试数据mysql生成随机字符串函数分享MySQL中随机生成固定长度字符串的方法在MySQL中生成随机密码的方法Mysql的语句生成后门木马的方法如何批量生成MySQL不重复手机号大表实例代码