`

顺序全局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语言...

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

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

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

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

    [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**灯光和**标准**灯光。 - **默认隐藏灯光**:在**...

    67.[开源][安卓][全局代理]proxydroid-master

    67.[开源][安卓][全局代理]proxydroid-master ProxyDroid是Android上的一个全局代理应用,遵循GPLv3协议,可以帮助你设置Android设备上的代理。proxydroid项目包含了ProxyDroid所有开放源代码。

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

    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