分布式全局唯一ID
方案一、UUID
UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。UUID的底层是由一组32位数的16进制数字构成。
优点:实现简单,全局唯一,不需要考虑冲突的问题,适合标示用户的场景。
缺点:UUID长度过程,mysql建议主键字段长度越短越好,而且UUID包含MAC地址信息,有可能会造成MAC地址泄露。UUID由于是无序的,所以插入性能不是很好,适合写频率较低的场景,因为在数据库设计中,主键一般都是聚集索引,而索引一般是B+树,B+对于有序的插入是分裂追加节点,而对于无序节点的插入,需要移动后续所有节点,性能表现较差。
方案二、自增主键
这个方案就是利用了MySQL的主键自增auto_increment,默认每次ID加n。在分布式的情况下,需要设置每个库的初始值和步长,避免主键冲突。
优点:递增主键,读写效率高,具有一定的业务可读性。
缺点:步长一旦设置,后期无法扩容。
方案三、雪花snowflake算法
雪花算法生成64位的二进制正整数,然后转换成10进制的数。64位二进制数由如下部分组成:
优点:整个ID有序递增,此方案每秒能够产生409.6万个ID,性能好、
缺点:依赖机器的时钟同步,如果出现时钟回调,有可能会主键重复。
方案四:Redis生产方案
利用redis的incr原子性操作自增来生产ID,一般算法为:年份 + 天数 + 小时 + redis自增
优点:ID递增,可读性强。
缺点:需要多发一次网络请求,对性能要求不高的可以考虑。
方案五:Sequence特性
这个特性在SQL Server 2012、Oracle中可用。这个特性是数据库级别的,允许在多个表之间共享序列号。
优点:没什么明显的优点
缺点:只能在SQL Server、Oracle使用
方案五:通过数据库集群编号+集群内的自增类型两个字段共同组成唯一主键
优点:实现简单,维护简单
缺点:需要业务逻辑处理复合主键,且该方法只能一开始就使用,不能从别的方案切换过来。
待续……
分布式全局唯一ID的更多相关文章
- Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案
一.前言 在前面的文章Mysql系列四:数据库分库分表基础理论中,已经说过分库分表需要应对的技术难题有如下几个: 1. 分布式全局唯一id 2. 分片规则和策略 3. 跨分片技术问题 4. 跨分片事物 ...
- 分布式全局唯一ID的实现
分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...
- (4.24)【mysql、sql server】分布式全局唯一ID生成方案
参考:分布式全局唯一ID生成方案:https://blog.csdn.net/linzhiqiang0316/article/details/80425437 分表生成唯一ID方案 sql serve ...
- 分布式全局唯一ID生成策略
为什么分布式系统需要用到ID生成系统 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在美团点评的金融.支付.餐饮.酒店.猫眼电影等产品的系统中,数据日渐增长,对数据库的分库分表后需要有 ...
- 分布式全局唯一ID与自增序列
包含时间顺序的ID 此场景最简单的实现方案,就是采用 twitter 的 Snowflake 算法.ID总长64位,第1位不可用,41位表示时间戳,10位表示生成机器的id,后12位表示序列号. 为什 ...
- 框架篇:分布式全局唯一ID
前言 每一次HTTP请求,数据库的事务的执行,我们追踪代码执行的过程中,需要一个唯一值和这些业务操作相关联,对于单机的系统,可以用数据库的自增ID或者时间戳加一个在本机递增值,即可实现唯一值.但在分布 ...
- 常见分布式全局唯一ID生成策略
全局唯一的 ID 几乎是所有系统都会遇到的刚需.这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义.工业上有多种策略来获取这个全局唯一的id,针对常见的几种场景,我在这里进行 ...
- 分布式全局唯一ID生成策略
一.背景 分布式系统中我们会对一些数据量大的业务进行分拆,如:用户表,订单表.因为数据量巨大一张表无法承接,就会对其进行分库分表. 但一旦涉及到分库分表,就会引申出分布式系统中唯一主键ID的生成问题. ...
- redis 学习笔记3(哨兵模式下分布式锁的实现以及全局唯一id的生成)
redis实现分布式锁和全局唯一id应该是较为常见的应用. 实现基于redis的setNX,以及incr命令.还是比较简单的! 搭建环境以及配置好sping整合,做了下测试,有兴趣的载下来看看,自己做 ...
随机推荐
- 工程没有生成lib文件,只生成了dll文件
解决办法: 在工程上右键 -> 添加 -> 新建项 -> 选"模块定义文件(.def)" -> 随便填写个名字 -> 添加 重新编译编译就可生成.li ...
- 日期格式之——new Date()的用法
获取时间: 1 var myDate = new Date();//获取系统当前时间 获取特定格式的时间: 1 myDate.getYear(); //获取当前年份(2位) 2 myDate.getF ...
- 微信公众号系统在Linux下的部署操作
ps -ef | grep tomcat 查看tomcat进程
- redis 如何查看版本
./redis-cli -h 127.0.0.1 info | grep 'redis_version' redis-server -v
- vagrant 安装 ubuntu
安装版本: ubuntu trusty64(14.04) step1: 安装vagrant,vbox step2: 下载box文件(官网http://www.vagrantbox.es/) http ...
- apply( )与 call( ) 的区别
JavaScript中的每一个Function对象都有一个apply()方法和一个call()方法 语法 /*apply()方法*/ function.apply(thisObj[, argArray ...
- 页面头部<meta>中的属性和含义
1<meta name="robots" content="index, follow" /> none:搜索引擎将忽略此网页,等价于noin ...
- icheck的使用
一.什么是icheck 就是用来美化单选框.复选框的. 二.如何使用 1.下载 到 github 下载.https://github.com/fronteed/icheck 下载完毕.解压.目录结构如 ...
- Java练习 SDUT-1580_闰年
闰年 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 时间过得真快啊,又要过年了,同时,我们的人生也增长了一年的阅历,又 ...
- qt中绘制文字
(1)颜色QPen (2) 字体QFont (3)位置与对齐 void CircleWidget::paintEvent(QPaintEvent *event) { QPainter painter( ...