Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Twitter雪花算法PHP实现库Snowflake

Twitter雪花算法PHP实现库Snowflake

作者头像
Tinywan
发布于 2024-08-14 10:30:44
发布于 2024-08-14 10:30:44
25600
代码可运行
举报
文章被收录于专栏:开源技术小栈开源技术小栈
运行总次数:0
代码可运行

介绍

在分布式系统中,生成全局唯一的ID是一项常见的需求。Snowflake是Twitter开源的一种分布式ID生成算法,它可以在分布式环境下生成唯一的、趋势递增的ID,且不依赖于中央服务器。本文将介绍Snowflake算法的原理,使用PHP实现Snowflake生成器。

雪花算法结构

Snowflake算法生成的ID由64位组成,其中各部分的位数如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1位符号位 | 41位时间戳 | 10位工作机器ID | 12位序列号
  1. 符号位:始终为0,保证生成的ID为正整数。因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。
  2. 时间戳:使用41位来表示当前时间戳,精确到毫秒级,可以使用69年。41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。
  3. 工作机器ID:用于区分不同的工作节点,可以分配的工作机器ID范围为0~1023。但是 10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思就是最多代表 2 ^ 5 个机房(32 个机房),每个机房里可以代表 2 ^ 5 个机器(32 台机器),这里可以随意拆分,比如拿出4位标识业务号,其他6位作为机器号。可以随意组合。
  4. 序列号:用于解决同一毫秒内并发生成多个ID的冲突问题,可以支持每毫秒最多生成4096个ID。12 bit 可以代表的最大正整数是 2 ^ 12 - 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。也就是同一毫秒内同一台机器所生成的最大ID数量为4096

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
composer require godruoyi/php-snowflake -vvv

简单使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?php
/**
 * @desc snowflake
 * @author Tinywan(ShaoBo Wan)
 * @date 2024/8/14 22:45
 */
require '../vendor/autoload.php';

$snowflake = new \Godruoyi\Snowflake\Snowflake;

echo $snowflake->id() . PHP_EOL;

执行输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
663985260597348711

指定数据中心ID及机器ID

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$datacenterId = time();
$workerId = '1000000000000001';
$snowflake = new \Godruoyi\Snowflake\Snowflake($datacenterId, $workerId);

echo $snowflake->id() . PHP_EOL;

执行输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
663986323404837079

指定开始时间

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$snowflake = new \Godruoyi\Snowflake\Snowflake;
$snowflake->setStartTimeStamp(strtotime('2020-08-15')*1000);
echo $snowflake->id() . PHP_EOL;

执行输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
528938994126294755

高级用法

在 Laravel 中使用

可通过下面的方式快速集成到 Laravel 中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// App\Providers\AppServiceProvider

use Godruoyi\Snowflake\Snowflake;
use Godruoyi\Snowflake\LaravelSequenceResolver;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('snowflake', function ($app) {
            return (new Snowflake())
                ->setStartTimeStamp(strtotime('2019-10-10')*1000)
                ->setSequenceResolver(new LaravelSequenceResolver($app->get('cache.store')));
        });
    }
}
}
自定义序列号解决器

你可以通过实现 Godruoyi\\Snowflake\\SequenceResolver 接口来自定义序列号解决器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class YourSequence implements SequenceResolver
{
    /**
     *  {@inheritdoc}
     */
    public function sequence(int $currentTime)
    {
          // Just test.
        return mt_rand(0, 1);
    }
}

// usage

$snowflake->setSequenceResolver(new YourSequence);
$snowflake->id();

你也可以直接使用闭包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$snowflake = new \Godruoyi\Snowflake\Snowflake;
$snowflake->setSequenceResolver(function ($currentTime) {
    static $lastTime;
    static $sequence;

    if ($lastTime == $currentTime) {
        ++$sequence;
    } else {
        $sequence = 0;
    }

    $lastTime = $currentTime;

    return $sequence;
})->id();

小结

本文介绍了Snowflake算法的原理,并使用PHP实现的Snowflake生成器。Snowflake算法可以在分布式系统中生成唯一的、趋势递增的ID,并且不依赖于中央服务器。

在实际应用中,我们可以将Snowflake生成器集成到分布式系统中,用于生成全局唯一的ID,满足分布式环境下的唯一ID需求。希望本文的介绍能够帮助读者了解Snowflake算法的实现原理,并在实际开发中使用Snowflake生成器生成分布式唯一ID。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
雪花算法
如上图所述,由1个写库变成3个写库,每个写库设置不同的 auto_increment 初始值,以及相同的增长步长,以保证每个数据库生成的ID是不同的(上图中DB 01生成0,3,6,9…,DB 02生成1,4,7,10,DB 03生成2,5,8,11…)
Dean0731
2021/04/23
9710
雪花算法
雪花算法 & snowflake
首先 分布式id 是不需要存储在数据库中,我们必须考虑存储后所占用的空间,以及网络传输的效率。
收心
2022/01/17
1.1K0
雪花算法 & snowflake
面试官:讲讲雪花算法,越详细越好
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。
秦怀杂货店
2021/11/15
8660
分布式ID生成之雪花(SnowFlake)算法
分布式 ID 生成算法的有很多种,Twitter 的 SnowFlake 就是其中经典的一种。
码之有理
2024/03/12
6350
冷饭新炒:理解Snowflake算法的实现原理
上图是Snowflake的Github仓库,master分支中的REAEMDE文件中提示:初始版本于2010年发布,基于Apache Thrift,早于Finagle(这里的Finagle是Twitter上用于RPC服务的构建模块)发布,而Twitter内部使用的Snowflake是一个完全重写的程序,在很大程度上依靠Twitter上的现有基础架构来运行。
Throwable
2020/08/11
1.2K0
冷饭新炒:理解Snowflake算法的实现原理
雪花算法,原理及Java版实现
是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。
架构精进之路
2021/03/15
3400
雪花算法Snowflake
该算法通过二进制的操作进行实现,单机每秒内理论上最多可以生成 _ 1000 (2^12),_* 即 409.6 万个ID
ruochen
2021/11/23
1.4K0
漫画:什么是SnowFlake算法?
UUID是通用唯一识别码 (Universally Unique Identifier),在其他语言中也叫GUID,可以生成一个长度32位的全局唯一识别码。
用户5927304
2019/07/31
1K0
雪花算法SnowFlake生成唯一ID
本文主要介绍SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。
码农编程进阶笔记
2022/05/24
1.8K0
雪花算法SnowFlake生成唯一ID
基于Twitter的Snowflake算法实现分布式高效有序ID生产黑科技(无懈可击)
参考美团文档:https://tech.meituan.com/2017/04/21/mt-leaf.html
爱撸猫的杰
2019/03/28
1.6K0
基于Twitter的Snowflake算法实现分布式高效有序ID生产黑科技(无懈可击)
雪花算法到底是啥原理?附 Java 实现!
其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。
Java技术栈
2021/05/11
1.1K0
雪花算法的原理,掌握后去勇闯天涯!
SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的,后面的代码中有详细的注解。
二哥聊运营工具
2021/12/17
3110
雪花算法的原理,掌握后去勇闯天涯!
分布式ID生成系统之雪花算法详解
在当今的云计算和微服务架构盛行的时代,分布式系统已成为软件开发的重要组成部分。随着系统规模的扩大和业务的复杂化,对数据一致性和唯一性的要求也越来越高,尤其是在全局唯一标识符(ID)的生成上。因此,分布式ID生成系统应运而生,成为保证数据唯一性和提高系统可扩展性的关键技术之一。雪花算法(Snowflake)是Twitter开源的一种算法,用于生成64位的全局唯一ID,非常适用于分布式系统中生成唯一标识符。下面我们将深入探讨雪花算法的原理、结构和实现方式。
修己xj
2024/03/04
6550
分布式ID生成系统之雪花算法详解
分布式唯一 ID 之 Snowflake 算法
Snowflake(雪花) 是一项服务,用于为 Twitter 内的对象(推文,直接消息,用户,集合,列表等)生成唯一的 ID。这些 IDs 是唯一的 64 位无符号整数,它们基于时间,而不是顺序的。完整的 ID 由时间戳,工作机器编号和序列号组成。当在 API 中使用 JSON 数据格式时,请务必始终使用 id_str 字段而不是 id,这一点很重要。这是由于处理JSON 的 Javascript 和其他语言计算大整数的方式造成的。如果你遇到 id 和 id_str 似乎不匹配的情况,这是因为你的环境已经解析了 id 整数,并在处理的过程中仔细分析了这个数字。
阿宝哥
2019/11/06
1.9K0
分布式唯一 ID 之 Snowflake 算法
Java系列之雪花算法和原理
SnowFlake 算法:是 Twitter 开源的分布式 id 生成算法。 核心思想:使用一个 64 bit 的 long 型的数字作为全局唯一 id。 首先了解一下雪花ID的结构:从网上盗用一张;
沁溪源
2020/11/24
1.2K0
Java系列之雪花算法和原理
啥?asong要出新系列之雪花算法(go)
雪花算法产生的背景当然是twitter高并发环境下对唯一ID生成的需求,得益于twitter内部牛逼的技术,雪花算法能够流传于至今并且被广泛使用,是因为它有几个特点
Golang梦工厂
2022/07/07
3570
啥?asong要出新系列之雪花算法(go)
分布式id生成算法-snowflake算法
snowflake 算法是 twitter 开源的分布式 id 生成算法,采用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。
Li_XiaoJin
2022/06/10
3440
分布式id生成算法-snowflake算法
雪花算法Snowflake
雪花Id生成算法,是鼎鼎有名的分布式Id生成算法。它的优点在于,在分布式系统中快速生成有时间顺序的唯一编号!Snowflake实测每秒可生成900万个唯一Id。
JusterZhu
2022/12/07
1K0
雪花算法Snowflake
雪花算法认知(Twitter_Snowflake)
99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完事情,战胜焦虑,战胜那些心里空荡荡的时刻,而不是选择逃避。不要站在原地想象困难,行动永远是改变现状的最佳方式
山河已无恙
2025/02/25
560
雪花算法认知(Twitter_Snowflake)
分布式唯一ID解决方案-雪花算法
全局唯一 ID 几乎是所有设计系统时都会遇到的,全局唯一 ID 在存储和检索中有至关重要的作用。
JavaPub
2021/01/12
6.9K1
相关推荐
雪花算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验