您现在的位置是:首页 > 学无止境 > 其他网站首页其他 雪花算法(SnowFlake)实现——Java与PHP

雪花算法(SnowFlake)实现——Java与PHP

  • 莫愁
  • 其他
  • 2020-07-05
简介分库分表后,id主键如何处理?其实这是分库分表后需要面对的一个问题,因为分成多个表后,我们需要一个全局唯一的 id 来支持。分布式id生成算法的有很多种,Twitter的SnowFlake就是其中经典的一种。
字数 3116

算法原理

SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:

雪花算法(SnowFlake)实现——Java与PHP

snowflake算法来源于Twitter,使用scala语言实现,snowflake算法的特性是有序、唯一,并且要求高性能,低延迟(每台机器每秒至少生成10k条数据,并且响应时间在2ms以内),要在分布式环境(多集群,跨机房)下使用,因此snowflake算法得到的ID是分段组成的:

  • 1bit:符号位,固定是0,表示全部ID都是正整数41bit:表示的是时间戳,单位是毫秒。
  • 41 bits 可以表示的数字多达 2^41 - 1 ,也就是可以标识 2^41 - 1 个毫秒值,换算成年就是表示69年的时间。
  • 10bit:机器ID,有异地部署,多集群的也可以配置,需要线下规划好各地机房,各集群,各实例ID的编号
  • 12bit:序列ID,用来记录同一个毫秒内产生的不同 id,12 bits 可以代表的最大正整数是 2^12 - 1 = 4096 ,也就是说可以用这个 12 bits 代表的数字来区分同一个毫秒内的 4096 个不同的 id。

优点

  1. 毫秒数在高位,自增序列在低位,整个ID都是趋势递增的。
  2. 不依赖数据库等第三方系统,以服务的方式部署,稳定性更高,生成ID的性能也是非常高的。
  3. 可以根据自身业务特性分配bit位,非常灵活。

缺点

  1. 强依赖机器时钟,如果机器上时钟回拨,会导致发号重复或者服务会处于不可用状态。

代码

PHP

Java


转载: 感谢您对莫愁个人博客网站平台的认可,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“来源莫愁个人博客 https://www.mochoublog.com/study/409.html”。

文章评论

    • 评论
    人参与,条评论

技术在线

服务时间

周一至周日 12:00-22:00

关闭下雪
关闭背景特效