hutool 雪花id mysql中要求的字段类型 雪花idc模板

您所在的位置:网站首页 雪花idc模板在哪个文件 hutool 雪花id mysql中要求的字段类型 雪花idc模板

hutool 雪花id mysql中要求的字段类型 雪花idc模板

2024-06-29 08:35| 来源: 网络整理| 查看: 265

1、背景

首先个人理解,赋予一个背景,比如推荐系统中抖音里面,每天都有很多的作者去上传很多的视频,量级可能非常大,并且之前的视频也会累积,那么如何区分不同的视频内容呢,就是id了,类似于我们的身份证件,但是如何做到唯一标识呢?

2、实现框架

这个就会用到传说中的---雪花算法。

雪花算法(Snowflake)是twitter公司内部分布式项目采用的ID生成算法,开源后广受国内大厂的好评,在该算法影响下各大公司相继开发出各具特色的分布式生成器。

名字很高大上哈,其实很简单,看下面这张图片,就是雪花算法的id构成。

hutool 雪花id mysql中要求的字段类型 雪花idc模板_生成器

Snowflake生成的是Long类型的ID,一个Long类型占8个字节,每个字节占8比特,也就是说一个Long类型占64个比特。

Snowflake ID组成结构:正数位(占1比特)+ 时间戳(占41比特)+ 机器ID(占5比特)+ 数据中心(占5比特)+ 自增值(占12比特),总共64比特组成的一个Long类型。

解释一下各个部分,总共有4个小部分

1bit:一般是符号位,不做处理。long的最高位是符号位代表正负,正数是0,负数是1,一般生成ID都为正数,所以默认为0。41bit:用来记录时间戳,这里可以记录69年,如果设置好起始时间比如今年是2022年,那么可以用到2091年,可是到期了怎么办?要是这个系统能用69年,我相信这个系统早都重构了好多次了。(解释一下为什么是69年: 毫秒级的时间,不建议存当前时间戳,而是用(当前时间戳 - 固定开始时间戳)的差值,可以使产生的ID从更小的值开始;41位的时间戳可以使用69年,(1L 主要目标:更新id

2>明确主要目标后,就简单了,再回顾一下最上面的那张图片,其实就是去更新每一部分的时间

第一部分41bit的时间戳: 最前面的符号位不考虑哈,用(当前的时间戳-一个固定开始的时间戳)来更新,比方说之前,抖音于2016年9月20号上线,那固定时间戳就取这个上线时间对应的时间戳就好。第二部分10bit的工作机器id: 这个如果需要更新就更新成对应的就好,比如你的数据中心是1,机器是1那么这10位就是0000100001。第三部分12bit的序列号:这部分就是针对于同一毫秒下,最多可以接受4095个新的内容。多了就等下一毫秒就好,比如你是当前毫秒下第一个内容,那么对应的就是0000 0000 0001 ,第十个内容就是 0000 0000 1010; 如果是第4096个内容,就需要到下一毫秒,并且将值置为0,也就是0000 0000 0000

3>其实核心的核心就是在更新id,只不过雪花算法提出了一种id生成的规则,可以满足产生足够多的唯一的id来标识内容。

4、优缺点优点:时间有序,并且无法根据id判断某一段时间内的id数,安全缺点:依赖时间戳,也就是依赖机器的时钟,如果机器时钟有问题比如时钟回拨,也就是可能会获得同样的时间戳,这样就可能导致同样的id。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3