为什么需要保证唯一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的实现方案的更多相关文章

  1. 分布式系统唯一ID的生成方案讨论

    在分布式系统下唯一id问题,就是id咋生成?比如分表分库,因为要是一个表分成多个表之后,每个表的id都是从1开始累加自增长,那是不对的.举个例子,一个表拆分为了2张表,每个表的id都从1开始累加,这个 ...

  2. (4.24)【mysql、sql server】分布式全局唯一ID生成方案

    参考:分布式全局唯一ID生成方案:https://blog.csdn.net/linzhiqiang0316/article/details/80425437 分表生成唯一ID方案 sql serve ...

  3. 如何在高并发分布式系统中生成全局唯一Id

    月整理出来,有兴趣的园友可以关注下我的博客. 分享原由,最近公司用到,并且在找最合适的方案,希望大家多参与讨论和提出新方案.我和我的小伙伴们也讨论了这个主题,我受益匪浅啊…… 博文示例: 1.     ...

  4. 高并发分布式系统中生成全局唯一Id汇总

    数据在分片时,典型的是分库分表,就有一个全局ID生成的问题.单纯的生成全局ID并不是什么难题,但是生成的ID通常要满足分片的一些要求:   1 不能有单点故障.   2 以时间为序,或者ID里包含时间 ...

  5. 关于全局唯一ID生成方法

    引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  6. 如何在高并发分布式系统中生成全局唯一Id(转)

    http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html 又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文, ...

  7. (转)如何在高并发分布式系统中生成全局唯一Id

    又一个多月没冒泡了,其实最近学了些东西,但是没有安排时间整理成博文,后续再奉上.最近还写了一个发邮件的组件以及性能测试请看 <NET开发邮件发送功能的全面教程(含邮件组件源码)> ,还弄了 ...

  8. 全局唯一ID发号器的几个思路

    标识(ID / Identifier)是无处不在的,生成标识的主体是人,那么它就是一个命名过程,如果是计算机,那么它就是一个生成过程.如何保证分布式系统下,并行生成标识的唯一与标识的命名空间有着密不可 ...

  9. 高并发分布式环境中获取全局唯一ID[分布式数据库全局唯一主键生成]

    需求说明 在过去单机系统中,生成唯一ID比较简单,可以使用MySQL的自增主键或者Oracle中的sequence, 在现在的大型高并发分布式系统中,以上策略就会有问题了,因为不同的数据库会部署到不同 ...

  10. 分布式全局唯一ID的实现

    分布式全局唯一ID的实现 前言 上周末考完试,这周正好把工作整理整理,然后也把之前的一些素材,整理一番,也当自己再学习一番. 一方面正好最近看到几篇这方面的文章,另一方面也是正好工作上有所涉及,所以决 ...

随机推荐

  1. 通过ref调取子组件方法

    子 async update(res){ //this.$refs.child.animates(); this.userform = res; }, 主 <DetailEdit @detail ...

  2. Django基础篇 04-模型类注册到后台Django Admin中

    一.django自带的admin的url地址 urls.py文件中 from django.contrib import admin from django.urls import path from ...

  3. C# byte[]与string的相互转换

    byte[]转string: string str = System.Text.Encoding.Default.GetString( byteArray ); string转byte[]: byte ...

  4. 1=C到底是哪个C

  5. seleniumUI自动化学习记录

    2019.2.9 尝试了一个启动浏览器并打开指定网址的程序: 这里首先要注意的就是浏览器的版本和selenium jar包的版本必须符合才行,不然会报错 2019.9.16 必须要下载相应的chrom ...

  6. 网易面经-hashmap是否能存null(debug源码)

    面试时一定要坚持自己的认知,不要让面试官两三下pua了. 结果是可以的 null作为key时被放在了tab下标为0的位置,只能有一个null null作为value时不受限制 虽然说value为nul ...

  7. elasticsearch第一天

    启动 elasticsearch -d不能用以root用户启动 外网可访问在elasticsearch.yml中添加配置http.host: 0.0.0.0network.host: 0.0.0.0d ...

  8. .NET dropdownlist控件绑定数据后,添加“全部”项,实现功能

    DropDownList在从数据库中得到数据源绑定后,计划为其添加一个"全部"或"不限"之类的项,添加方法现知的有两种: 1:在脚本中直接添加:<asp: ...

  9. Websocket是什么?

    一. WebSocket是什么? Websocket是一种网络通信协议,是一个在计算机里专门在[两点]之间传输数据的约定和规范. 二. 为什么存在WebSocket? 因为 HTTP 协议有一个缺陷: ...

  10. rust 条件编译 Debug Release

    #[cfg(debug_assertions)] macro_rules! debug { () => (std::println!()); ($($arg:tt)*) => ({ pri ...