分布式id生成方案

4 篇文章 0 订阅

分布式id生成方案

常见的分布式id方案

数据库自增主键

专门有一个数据库,数据库中搞一张表,专门用来进行生成主键id,进行insert一条数据,会返回给你一个主键,然后用这个主键作为数据的id进行插入的操作.
优点: 实现简单,落实方便 只需要一个数据库就可以进行实现
缺点: 单库单表,并发能力不高,不停往表里插入数据需要进行定时清理数据。

UUID

优点:本地生成,并发能力高,不依赖别的中间件
缺点:太长了,作为主键插入数据库的时候,会造成数据库的频繁分页的操作

Twitter开源的Snowflake方案

核心思想:64个bit位,41位放时间(最多使用69年),10位放机器标识(最多把snowflake程序部署在1024台机器上),12位放序号(每毫秒,每台机器,可以顺序生成4096个ID),最高位1个bit是0

snowflake程序分布式部署在多台机器上,每台机器生成的每个ID,都是这一毫秒、机器id、序号,每台机器每毫秒最多4096个ID,绝对够用了,分布式方案可以抗高并发,大不了加机器,最多1024台机器,纯基于内存生成,性能很高

优点:高性能,高并发,可伸缩
缺点:有时钟回拨的问题,需要进行独立部署和维护

Redis自增机制

redis的incrby 命令 redis 单线程 效率高
优点:redis 单线程 效率高 一般公司都会用redis
缺点:客户端需要自己进行封装 不易进行扩容,

基于时间+业务id

比方说 一些打车软件,可以使用时间戳+起点编号+车牌号 作为主键id 业务上就不会有重复的逻辑。
优点:实现简单,没有并发,扩容之类的问题
缺点:只能针对一些特定业务,别的一些业务可能就无法进行使用这个逻辑

flickr公司的方案

CREATE TABLE uid_sequence (
id bigint(20) unsigned NOT NULL auto_increment,
stub char(1) NOT NULL default ‘’,
PRIMARY KEY (id),
UNIQUE KEY stub (stub)
) ENGINE=MyISAM;

REPLACE INTO uid_sequence (stub) VALUES (‘test’);
SELECT LAST_INSERT_ID();
是用replace into 代替insert into 免表行数过大,一张表就一行数据,然后再select获取这个表的最新id,last_insert_id()函数是connection级别的,就你这个连接的最近insert生成的id,多个客户端之间没影响

美团开源的leaf框架

可以参考https://tech.meituan.com/2017/04/21/mt-leaf.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小园子的小菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值