雪花算法(01)介绍

作者: 郭艺宾 | 来源:发表于2019-08-11 16:29 被阅读0次

针对每个公司,随着服务化演进,单个服务越来越多,数据库分的越来越细,有的时候一个业务需要分成好几个库,这时候自增主键或者序列之类的主键id生成方式已经不再满足需求,分布式系统中需要的是一个全局唯一的id生成规则。既然号称在全局分布式系统中唯一,那么主键的生成规则必然要复杂一些,以前看过很多资料,都对雪花的生成一知半解,最后才发现是对Java的位运算没有彻底了解,这里想针对雪花算法,以一种浅显的的方式来进行学习,去除以前的一知半解和对雪花算法的神秘感。

雪花算法生成的最终结果其实就是一个long类型的Java长整型数字,这是一个大前提!算法所有的内容都是针对这个数字进行运算的。Java基础类型相信都很熟悉,有32位的整型int类型,和64位的长整型long类型。我们单说long类型,64位说的是数字转换为二进制形式时候的表现,其中第一位表示的是正负,也就是符号,剩下的63位表示的是字面数字。我们来简单看一下几个关键的long数字转换成二进制的形式:

再来看一个二进制数字转换为long类型:

上面都是Java基础知识,相信大家都懂。

生成一个long类型的数字id,其实就是对这64位的二进制形式里面填值,把这64位分成几个部分,彼此间互不影响,每部分都有自己的生成规则,这样在一定的简单的大前提下,能保证全局唯一。

先说第一位,long类型的数字是有符号的,第一位是0就是正数,1是负数,我们生成的id必然要正数,所以第一位可以确定为0不变。

剩下的63位分成三大部分,第一部分占41位,用来表示时间,什么时间后面会详细介绍。第二部分占10位,用来表示程序所在机器的信息,剩下的第三部分占12位,填充的是一个序列,可以理解为递增数字,这样前面的时间和机器数字如果都一样的话,用序列的区别来生成不同的id。

上面的三大块信息转换成数字,填充到63位当中,基本可以保证任何时间任何机器生产的任何id不重复,可以推理出,时间和序列都是不可控的,但是机器信息是我们可以控制的,也就是说设置好机器信息是分布式id不重复的关键

根据上面的理论可以开始学习雪花算法。

代码地址:https://gitee.com/blueses/snowflake-demo  01

相关文章

  • 雪花算法(01)介绍

    针对每个公司,随着服务化演进,单个服务越来越多,数据库分的越来越细,有的时候一个业务需要分成好几个库,这时候自增主...

  • 雪花算法(02)算法中的位运算

    前面介绍了雪花算法的理论基础,可以对大概的算法有个了解,但是细节上可能还是模糊,下面来说一下雪花算法中用到的位运算...

  • 修改redis zset的score为64位整形以支持雪花ID算

    关于雪花ID算法的介绍有很多文章,就不画蛇添足了,当然雪花ID算法也有一个问题是时间回拨的问题,这个可以参考以下两...

  • 个性化推荐算法实战第01章个性化推荐算法综述

    @[toc] 个性化推荐算法实战第01章个性化推荐算法综述 1、什么是推荐系统? 在介绍推荐算法之前需要先介绍一下...

  • 雪花算法

    public class IdSnowCreate { }

  • 雪花算法

  • 雪花算法

    世界上没有两片一样的雪花.雪花算法不会生成一样的的ID 基本原理: 采用的是时间戳+机器号+没毫秒生成的序列号 第...

  • 雪花算法

    雪花算法的原理和实现Java_雨夜青草的博客-CSDN博客_雪花算法 64 = 1 41 10 12

  • 雪花算法

    雪花算法-snowflake 背景: 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以...

  • 雪花算法

    SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit...

网友评论

    本文标题:雪花算法(01)介绍

    本文链接:https://www.haomeiwen.com/subject/umffjctx.html