`

顺序全局id生成方案-flickr-进阶

阅读更多

flickr:http://wangxinchun.iteye.com/blog/2373125

目前flickr 方案存在的问题:

性能较差,每次都要连接数据库db,高并发下db吃力

 

新方案:

数据库每次批量返回多个id记录;双Buffer请求消峰,增加可用性

 

设计思路:

1、利用数据库的锁和事务

2、每次获取返回本次拿到min_id,max_id,step,batch_size,其中有效的记录是:id = min_id + n*step ,并且 id<=max_id

3、为了削弱波峰请求的影响,双Buffer机制,当id 取到 id > (min_id+max_id)/2 时,加载第二个Buffer

 

其中 2  和 3 需要服务的代理来实现

 

db 初始化数据如下:

 

 

DROP TABLE idg_1;
DROP TABLE idg_2;
DROP TABLE idg_3;


CREATE TABLE `idg_1` (
   `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
   `key` VARCHAR(100) DEFAULT '',
   `min_id` BIGINT(20) NOT NULL ,
   `max_id` BIGINT(20) NOT NULL DEFAULT '0',
   `step` INT(11) NOT NULL DEFAULT '3',
   `batch_size` INT(11) NOT NULL DEFAULT '3000',
   UNIQUE KEY `id` (`id`),
   UNIQUE KEY `idx_key` (`key`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
 
 CREATE TABLE `idg_2` (
   `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
   `key` VARCHAR(100) DEFAULT '',
   `min_id` BIGINT(20) NOT NULL ,
   `max_id` BIGINT(20) NOT NULL DEFAULT '0',
   `step` INT(11) NOT NULL DEFAULT '3',
   `batch_size` INT(11) NOT NULL DEFAULT '3000',
   UNIQUE KEY `id` (`id`),
   UNIQUE KEY `idx_key` (`key`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
 
 CREATE TABLE `idg_3` (
   `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `key` VARCHAR(100) DEFAULT '',
   `min_id` BIGINT(20) NOT NULL ,
   `max_id` BIGINT(20) NOT NULL DEFAULT '0',
   `step` INT(11) NOT NULL DEFAULT '3',
   `batch_size` INT(11) NOT NULL DEFAULT '3000',
   UNIQUE KEY `id` (`id`),
   UNIQUE KEY `idx_key` (`key`)
 ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
 
 
 INSERT INTO idg_1(`key`,max_id,min_id,step,batch_size) VALUE ('nts',1,1,3,1000);
 INSERT INTO idg_2(`key`,max_id,min_id,step,batch_size) VALUE ('nts',2,2,3,1000);
 INSERT INTO idg_3(`key`,max_id,min_id,step,batch_size) VALUE ('nts',3,3,3,1000);
 
 
#模拟数据查询
BEGIN
UPDATE idg_1 t  SET t.min_id =t.max_id+step,  t.max_id = max_id + step*batch_size WHERE `key` = 'nts';
SELECT t.min_id,t.max_id,t.step,t.batch_size  FROM idg_1 t WHERE `key` = 'nts';
COMMIT;
END;

BEGIN
UPDATE idg_2 t  SET t.min_id =t.max_id+step,  t.max_id = max_id + step*batch_size WHERE `key` = 'nts';
SELECT t.min_id,t.max_id,t.step,t.batch_size  FROM idg_2 t WHERE `key` = 'nts';
COMMIT;
END;

BEGIN
UPDATE idg_3 t  SET t.min_id =t.max_id+step,  t.max_id = max_id + step*batch_size WHERE `key` = 'nts';
SELECT t.min_id,t.max_id,t.step,t.batch_size  FROM idg_3 t WHERE `key` = 'nts';
COMMIT;
END; 
 

 

 

后记:

如果需要扩容,也很简单,只需要修改min_id,max_id,step 即可

1、先改动batch_size 足够大,保证操作期间不会有请求

2、修改min_id,max_id,step

注意:

step:机器数目

min_id = 一个上次返回的最大值+new_step

max_id=min_id 即可

 

这个思路稍微改动DB,可以升级到redis方案

0
1
分享到:
评论

相关推荐

    vue-基础-进阶-111

    "vue-基础-进阶-111"这个标题暗示我们将深入探讨Vue的基础概念以及一些进阶技巧。在这个主题中,我们将涵盖以下几个关键知识点: 1. **Vue实例**:Vue的核心是Vue实例,它是Vue应用程序的起点。通过创建一个新的Vue...

    全局唯一ID生成

    时间戳保证了ID的生成顺序,工作节点ID确保不同节点生成的ID互不干扰,而序列号则用于在同一节点同一毫秒内生成多个ID。这种方法可支持上亿级别的ID生成,且无需中心协调,具备较高的并发性和扩展性。 除此之外,...

    分布式ID生成策略_snowflake算法

    Snowflake算法是由Twitter开源的一种高效且可扩展的分布式ID生成方案,广泛应用于Java和其他编程语言的系统中。 Snowflake算法的核心思想是将64位的整数划分为不同的部分,分别为: 1. **时间戳**(41位):自定义...

    TIA博途-顺序队列全局FB库文件-GF-sequential-Queue-FIFO.zip

    在这个特定的案例中,"TIA博途-顺序队列全局FB库文件-GF-sequential-Queue-FIFO.zip" 提供了一个基于顺序队列(Sequential Queue)的全局功能块(Global Function Block, GFB)库,该库特别关注先进先出(First In ...

    Intermediate Python - Python进阶-zh-v1.31

    《Python进阶》是针对已经有一定Python基础的学习者的一本指南,旨在帮助读者提升Python编程技巧和理解Python的高级特性。书中的内容涵盖了多个关键主题,包括函数参数、调试、生成器、数据结构、装饰器、异常处理...

    C语言进阶-深度剖析.zip

    《C语言进阶-深度剖析》是一本专为已经掌握C语言基础的读者设计的教程,旨在通过深度剖析,帮助读者提升对C语言的理解和应用能力。本压缩包包含的"**C语言进阶-深度剖析.pdf**"是完整的电子书资源,详细讲解了C语言...

    分布式唯一ID解决方案-雪花算法.docx

    ID生成器在应用程序中,经常需要全局唯一的ID作为数据库主键。如何生成全局唯一ID?首先,需要确定全局唯一ID是整型还是字符串?如果是字符串,那么现有的UUID就完全满足需求,不需要额外的工作。 SnowFlake算法...

    Springboot唯一编号整合,vesta全局唯一id生成器

    通过以上步骤,我们可以在SpringBoot项目中成功地集成Vesta ID Generator,为分布式系统提供稳定、高效的全局唯一ID生成方案。在高并发环境下,Vesta的优秀性能和易用性将为系统的可靠性和扩展性带来显著提升。

    [C语言进阶-重点、难点与疑点解析].牟海军

    《C语言进阶-重点、难点与疑点解析》是一本专门为那些已经掌握了C语言基础知识,渴望深入理解和提升技能的读者准备的书籍。C语言,作为计算机科学的基础,以其高效、灵活和强大的底层控制能力而备受青睐。这本书的...

    Go-token服务提供token一致性服务以及相关的全局ID生成服务等

    在IT行业中,尤其是在分布式系统和微服务架构的设计与实现中,令牌(Token)服务和全局唯一ID(Global Unique Identifier, GUID)生成服务是至关重要的组件。Go语言由于其简洁、高效的特性,常被用于构建这类服务。...

    Mysql全局ID生成方法

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

    C语言进阶-第2讲C语言复习共25页.pdf.zip

    15. **优化技巧**:了解编译器优化选项,以及手动优化代码的方法,如减少函数调用,避免全局变量等。 以上只是C语言进阶学习的一部分内容,实际的学习过程可能还会涉及更多,例如操作系统接口、网络编程、图形界面...

    VRay-进阶.md

    ### VRay 进阶知识点详解 #### 一、光照表现 **VRay**中的光照表现是实现逼真渲染的关键之一。在**3D Max**中,光照可以通过多种方式进行设置,主要包括**VRay**灯光和**标准**灯光。 - **默认隐藏灯光**:在**...

    cpp-idgen是一个可以生成全局唯一自增id的分布式的高可用服务

    cpp-idgen是一个专门为生成全局唯一且自增ID...总之,cpp-idgen作为一款分布式ID生成服务,为大型分布式系统提供了可靠的全局唯一自增ID解决方案,其设计理念和技术实现对于理解和构建类似的系统具有重要的参考价值。

    动态链接库进阶-提高学习

    4. **线程安全和全局变量**:由于多个线程可能同时访问同一DLL,因此需要了解如何处理线程安全问题,尤其是在涉及到全局变量时。理解TLS(Thread Local Storage)可以帮助解决这个问题。 5. **版本控制和兼容性**:...

    AN0024-RT-Thread-ulog 日志组件应用笔记 - 进阶篇1

    《RT-Thread ULOG日志组件应用笔记 - 进阶篇》 RT-THREAD ULOG是RT-THREAD实时操作系统中的一个关键组件,用于提供高效、灵活的日志记录功能。本篇应用笔记主要针对进阶用户,详细介绍ULOG的高级特性,帮助开发者更...

    C语言深度进阶篇-王桂林-

    ### C语言深度进阶篇-王桂林- #### 数据类型 - **内存**:在计算机科学中,内存(Memory)是用于存储数据的地方。在C语言中,数据存储于内存的不同区域,例如栈、堆等。栈空间用于存放局部变量、函数参数及返回...

Global site tag (gtag.js) - Google Analytics