全局唯一ID的实现方案
为什么需要保证唯一ID?
在单机服务架构中,数据库的每一个业务表的主键ID都是允许自增的,但是在分布式服务架构的分库分表的设计,使得多个库或者多个表存储了相同的业务表,如果没有一个全局的唯一ID设计方案,可能就导致了不同表(但业务逻辑是相同的)的ID相撞了。

虽然在不同数据库中,但是在用户层是无感知的,都是当做相同的业务表来看。
常见的方案
UUID
UUID是由一组32位16进制数字构成,UUID在java中有五套实现方案,第一是基于时间的UUID,第二是基于名字和MD5算法的UUID,第三是基于名字和SHA1算法的UUID,第四是Distributed Computing Environment(DCE)安全的UUID,第五是基于随机的UUID,这是java中默认的
UUID的缺点就是UUID太长了,不容易存储,以及UUID是无序的,不能比较,不利于innodb的索引,因为UUID无序容易造成记录顺序经常变更。
数据库生成
不依赖外界,由数据库自己生产相应的id,比如分库数据库,我们把每张表的起始id设计成不一样的,然后有相同的步长,这样就不会有冲突了了
缺点就是对数据库强依赖
基于Redis生成
略
雪花算法
雪花算法是由推特提出的,将64位(1+41+10+12)数(java中就是long类型)分割成不同含义,然后根据时间戳生成不同的id

定义各个部分的id以及shift大小

其中,workid和datacenterid可以自定义shift大小,默认是5语

生成id就是将各个部分 或操作


雪花算法要了解基本过程,有很多大厂的分布式唯一id方案是基于雪花算法改良的。其余的分布式唯一id之后再学习记录。
全局唯一ID的实现方案的更多相关文章
- 分布式系统唯一ID的生成方案讨论
在分布式系统下唯一id问题,就是id咋生成?比如分表分库,因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那是不对的.举个例子,一个表拆分为了2张表,每个表的id都从1开始累加,这个 ...
- (4.24)【mysql、sql server】分布式全局唯一ID生成方案
参考:分布式全局唯一ID生成方案:https://blog.csdn.net/linzhiqiang0316/article/details/80425437 分表生成唯一ID方案 sql serve ...
- 如何在高并发分布式系统中生成全局唯一Id
月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1. ...
- 高并发分布式系统中生成全局唯一Id汇总
数据在分片时,典型的是分库分表,就有一个全局ID生成的问题.单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求: 1 不能有单点故障. 2 以时间为序,或者ID里包含时间 ...
- 关于全局唯一ID生成方法
引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- 如何在高并发分布式系统中生成全局唯一Id(转)
http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html 又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文, ...
- (转)如何在高并发分布式系统中生成全局唯一Id
又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...
- 全局唯一ID发号器的几个思路
标识(ID / Identifier)是无处不在的,生成标识的主体是人,那么它就是一个命名过程,如果是计算机,那么它就是一个生成过程.如何保证分布式系统下,并行生成标识的唯一与标识的命名空间有着密不可 ...
- 高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]
需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...
- 分布式全局唯一ID的实现
分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...
随机推荐
- 通过ref调取子组件方法
子 async update(res){ //this.$refs.child.animates(); this.userform = res; }, 主 <DetailEdit @detail ...
- Django基础篇 04-模型类注册到后台Django Admin中
一.django自带的admin的url地址 urls.py文件中 from django.contrib import admin from django.urls import path from ...
- C# byte[]与string的相互转换
byte[]转string: string str = System.Text.Encoding.Default.GetString( byteArray ); string转byte[]: byte ...
- 1=C到底是哪个C
- seleniumUI自动化学习记录
2019.2.9 尝试了一个启动浏览器并打开指定网址的程序: 这里首先要注意的就是浏览器的版本和selenium jar包的版本必须符合才行,不然会报错 2019.9.16 必须要下载相应的chrom ...
- 网易面经-hashmap是否能存null(debug源码)
面试时一定要坚持自己的认知,不要让面试官两三下pua了. 结果是可以的 null作为key时被放在了tab下标为0的位置,只能有一个null null作为value时不受限制 虽然说value为nul ...
- elasticsearch第一天
启动 elasticsearch -d不能用以root用户启动 外网可访问在elasticsearch.yml中添加配置http.host: 0.0.0.0network.host: 0.0.0.0d ...
- .NET dropdownlist控件绑定数据后,添加“全部”项,实现功能
DropDownList在从数据库中得到数据源绑定后,计划为其添加一个"全部"或"不限"之类的项,添加方法现知的有两种: 1:在脚本中直接添加:<asp: ...
- Websocket是什么?
一. WebSocket是什么? Websocket是一种网络通信协议,是一个在计算机里专门在[两点]之间传输数据的约定和规范. 二. 为什么存在WebSocket? 因为 HTTP 协议有一个缺陷: ...
- rust 条件编译 Debug Release
#[cfg(debug_assertions)] macro_rules! debug { () => (std::println!()); ($($arg:tt)*) => ({ pri ...