数据库|分布式id生成策略,我和面试官扯了一个半小时( 三 )
我:但是这种方法相对于上面的关系型数据库生成分布式ID的方法而言 , 已经优越了许多 。
我:若是数据量比较大的话 , 重启Redis的时间也会比较长 , 可以采用Redis的集群方式 。
面试官:你能手写一下Redis的生成分布式ID的工具类代码吗?
我奔溃了 , 我最怕手写了 , 因为工具类这种东西 , 基本就是项目开始的时候写一次 , 后面对后市重复使用 , 记不住 , 还要手写 , 这也太难为我怕虎了吧 。
我:手写应该不行 , 因为有些API记不住 , 工具类基本就是项目开始的时候写一些 , 后续都没有去看过了 , 没有专门去记它 。
我:我可以使用您的电脑吗?使用电脑应该可以敲出这些工具类 。
面试官:可以的 , 这边电脑给你 , 你在这个测试项目下吧 。
我:好的 , 谢谢 。
时间流逝中........
大概敲了几分钟 , 废了九牛二虎之力 , 终于敲出来了 , 有好多API记不住 , 只能慢慢的找了 , 写了主要两种方式来生成分布式ID 。
第一种是使用\tRedisAtomicLong
原子类使用CAS操作来生成ID 。
使用\tRedisAtomicLong 原子类使用CAS操作来生成ID
第二种是使用\tredisTemplate.opsForHash()
和结合\tUUID
的方式来生成生成ID 。
使用\tredisTemplate.opsForHash() 和结合\tUUID 的方式来生成生成ID
我把电脑移回给面试官 , 他很快的扫了一下我的代码 , 说了一句 。
面试官:小伙子 , 不写注释哦 , 这个习惯不好哦 。
我:哦哦 , 谢谢提醒 , 不好意思 , 下次我会注意的 。
雪花算法我:第六种方式是\t「 雪花算法\t」 , 也是现在市面上比较流行的生成分布式ID的方法 。
说着说着 , 我知道画图又是必不可少的了 , 于是在桌子上有画了起来 , 面试官好奇的看看我 , 知道了我在干啥 , 又耐心的等了等 。
我:他是采用64bit作为id生成类型 , 并且将64bit划分为 , 如下图的几段 。
我顺手把我画的图递给他看了看 , 接着对着这个图进行解释 。
我:第一位作为标识位 , 因为Java中long类型的时代符号的 , 因为ID位正数 , 所以第一位位0 。
我:接着的41bit是时间戳 , 毫秒级位单位 , 注意这里的时间戳并不是指当前时间的时间戳 , 而是值之间差(\t「 当前时间-开始时间\t」) 。
我:这里的开始时间一般是指ID生成器的开始时间 , 是由我们程序自己指定的 。
我:接着后面的10bit:包括5位的\t「 数据中心标识ID(datacenterId)和5位的机器标识ID(workerId)\t」 , 可以最多标识1024个节点(1<<10=1024) 。
我:最的12位是序列号 , 12位的计数顺序支持每个节点每毫秒差生4096序列号(1<<12=4096) 。
我:雪花算法使用数据中心ID和机器ID作为标识 , 不会产生ID的重复 , 并且是在本地生成 , 不会消耗网络 , 效率高 , 有数据显示 , 每秒能生成26万个ID 。
我:但是雪花算法也是又自己的缺点 , 因为雪花算法的计算依赖于时间 , 若是系统时间回拨 , 就会产生重复ID的情况 。
面试官:那对于时间回拨产生重复ID的情况 , 你有什么比较好的解决方案吗?
我:在雪花算法的实现中 , 若是其前置的时间等于当前的时间 , 就抛出异常 , 也可以关闭掉时间回拨 。
我:对于回拨时间比较短的 , 可以等待回拨时间过后再生成ID 。
【数据库|分布式id生成策略,我和面试官扯了一个半小时】面试官:你可以帮我敲一个雪花算法吗?我这键盘给你 。
我: 。。。
我:好的 。
时间流逝中......
过了几分钟时间 , 也总算是把雪花算法给敲出来了 , 真正要老命 , 面个试怎么就那么难呢?
推荐阅读
- 兵器数据库|撑死一年也就130架,为何不能自动化生产?,F-35脉动生产线
- excel|教你Excel中快速生成1-10000(可指定)序列号
- 爱因斯坦|依据质能方程可以将质量转化为能量,能否用能量生成1g的质量呢?
- 产业气象站|利用微纳微尺度3D打印技术制备微流控液滴生成芯片
- 产业气象站|「itc分布式平台、高清LED显示屏、扩声系统案例」广东某水务局
- 天极网|中科大本科生成功设计出64位处理器:已成功流片、可运行Linux
- Java|一个支持百亿级别、无代码入侵的Java分布式日志系统,源码分享
- 通信世界网|中国移动首次在3GPP标准引入基于联邦学习的分布式智能架构
- 读芯术|认识“雪花ID”:如何在分布式环境中大规模生成唯一ID?
- 饿了么|Redis:最受程序员喜爱的数据库?