1. 说说你们的分布式ID设计方案
    我们采用Snowflake算法,生成一个64bit的数字,64bit被划分成多个段,分别表示时间戳、机器编码、序号。

    • 41位的时间序列(精确到毫秒,41位的长度可以使用69年)。
    • 10位的机器标识(10位的长度最多支持部署1024个节点)。
    • 12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)。
      优点:
    • 时间戳在高位,自增序列在低位,整个ID是趋势递增的,按照时间有序。
    • 性能高,每秒可生成几百万ID。
    • 可以根据自身业务需求灵活调整bit位划分,满足不同需求。
  2. Snowflake算法有什么缺点?
    它的算法依赖机器时钟,如果机器时钟回拨,会导致重复ID生成。虽然在单机上是递增的,但是分布式环境下,每台机器上的时钟不可能完全同步,有时候会出现不是全局递增的情况。

  3. UUID不是更简单吗,为什么不用?
    UUID是16字节128位长的数字,以36字节的字符串表示,UUID算法规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素。UUID过长,而且没有顺序,不适合用于数据库索引字段。

  4. Snowflake算法的ID太长了,有没有更短的方案
    可以采用基于Redis的原子操作INCR自增,比如订单号 = 日期 + 当日自增长号。

  5. 采用Redis方案的缺点是什么?
    • 如果系统中没有Redis,还需要引入,增加系统复杂度。
    • 需要编码和配置的工作量比较大。

参考(部分摘抄的文字版权属于原作者):

https://blog.csdn.net/hl_java/article/details/78462283
https://www.jianshu.com/p/2456c737aebb

面试连环炮系列(十一):说说你们的分布式ID设计方案的更多相关文章

  1. 面试刷题31:分布式ID设计方案

    面试中关于分布式的问题很多.(分布式事务,基本理论CAP,BASE,分布式锁)先来一个简单的. 简单说一下分布式ID的设计方案? 首先要明确在分布式环境下,分布式id的基本要求. 1, 全局唯一,在分 ...

  2. 分布式ID设计方案

    分布式ID的定义: 全局唯一 有序性 有意义 高可用 紧凑性 序列号的可预测性 方案1:使用数据库递增的顺序 最常见的方式.利用数据库,全数据库唯一. 优点: 1)简单,代码方便,性能可以接受. 2) ...

  3. 面试连环炮系列(二十一):你们的项目怎么使用kafka

    你们的项目怎么使用kafka? 我们采用kafka进行日志采集,准确点说是ELK方案,即elasticsearch + logstash + kibana + kafka.通过Spring AOP的方 ...

  4. 手撕面试官系列(十一):BAT面试必备之常问85题

    JVM专题 (面试题+答案领取方式见侧边栏)  Java 类加载过程? 描述一下 JVM 加载 Class 文件的原理机制? Java 内存分配. GC 是什么? 为什么要有 GC? 简述 Java ...

  5. 面试连环炮系列(二十三): StringBuffer与StringBuild的区别

    StringBuffer与StringBuild的区别 频繁修改字符串时,建议使用StringBuffer和StringBuilder类.StringBuilder相较于StringBuffer有速度 ...

  6. 面试连环炮系列(二十):TCP的滑动窗口协议是什么

    TCP的滑动窗口协议是什么 滑动窗口协议,用于网络数据传输时的流量控制,以避免拥塞的发生.该协议允许发送方在停止并等待确认前发送多个数据分组.由于发送方不必每发一个分组就停下来等待确认,因此该协议可以 ...

  7. 面试连环炮系列(十五):说说Eureka的高可用方案

    说说Eureka的高可用方案 至少3个Eureka实例才能满足高可用,配置方法如下: 准备三个节点node1,node2,node3. 在每个实例的application.xml文件里加入 eurek ...

  8. 面试连环炮系列(十四): HTTP状态码302的跳转逻辑

    HTTP状态码302的跳转逻辑 302状态码表示重定向,浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从响应的Location首部中获取(用户看到的效果就是他输入的地 ...

  9. 面试连环炮系列(三):synchronized怎么用的

    synchronized怎么用的? 用过,synchronized是常用的并发控制关键字,简单的说就是访问加锁.它可以修饰静态方法或者一个类的class对象,这叫类锁:可以修饰普通方法或者代码块,这叫 ...

随机推荐

  1. spring奇怪异常记录(会逐渐记录)

    1 严重: Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error cr ...

  2. PowerMock学习(十)之Mock spy的使用

    前言 回顾下之前学过的内容,会发现一点,如果在mock后不写when和thenReturn去指定,即便是mock调用任何方法,什么也不会做,也看不到什么效果. 划重点的时候来了,本身mock出来的对象 ...

  3. 【并发编程】关于Thread类的详细介绍

    多线程编程基础--Thread类 Thread类是Java中实现多线程编程的基础类.本篇博客就来介绍下Thread类的常用API和常见用法. Thread类常用的方法如下: Thread.active ...

  4. PHP页面跳转传值的三种常见方式

    一. POST传值 post传值是用于html的<form>表单跳转的方法,很方便使用.例如: ? 1 2 3 4 5 6 7  <html>  <form action ...

  5. 你真的了解foreach吗?

    引言 有C#基础的,当问到循环有哪些,会毫不犹豫的说出的for.do while.foreach及while这几种,但是到具体实际开发中,我们遇到一些问题,比如:到底选择哪种?为什么选择这种?哪种好像 ...

  6. Vue实现mp3音乐播放及动态进度条

    今天碰到一个Vue点击mp3播放及进度条动态走动的小功能,记录一下: 首先是通过HTML5 audio标签引入音频: <template> <div class="x-fo ...

  7. tensorflow学习笔记——AlexNet

    1,AlexNet网络的创新点 AlexNet将LeNet的思想发扬光大,把CNN的基本原理应用到了很深很宽的网络中.AlexNet主要使用到的新技术点如下: (1)成功使用ReLU作为CNN的激活函 ...

  8. 带你从头到尾捋一遍MySQL索引结构(1)

    从一个简单的表开始 create table user( id int primary key, age int, height int, weight int, name varchar(32) ) ...

  9. 【重学Node.js 第3篇】mongodb以及mongoose的使用

    mongodb以及mongoose的使用 本篇为这个系列的第三篇,想看更多可以直接去github的项目:https://github.com/hellozhangran/happy-egg-serve ...

  10. 商品分页查询 ego-prc 实现-easyui

    使用 easyui 的 DataGrid 控件实现商品的分页查询,DataGrid 控件提交分页所需要的 page 和rows 参数,后台响应包含总记录数 total 和需要显示的商品对象的集合 ro ...