国内破处 Twitter雪花算法PHP罢了库Snowflake

发布日期:2024-08-15 08:02    点击次数:161

国内破处 Twitter雪花算法PHP罢了库Snowflake

国内破处

在漫衍式系统中,生周详局独一的ID是一项常见的需求。Snowflake是Twitter开源的一种漫衍式ID生成算法,它不错在漫衍式环境下生成独一的、趋势递加的ID,且不依赖于中央做事器。本文将先容Snowflake算法的道理,使用PHP罢了Snowflake生成器。

雪花算法结构

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

记号位:永恒为0,保证生成的ID为正整数。因为二进制里第一个 bit 为要是是 1,那么齐是负数,然而咱们生成的 id 齐是正数,是以第一个 bit 融合齐是 0。

时分戳:使用41位来暗意面前时分戳,精准到毫秒级,不错使用69年。41 bit 不错暗意的数字多达 2^41 - 1,也便是不错标记 2 ^ 41 - 1 个毫秒值,换算成年便是暗意 69 年的时分。

职责机器ID:用于差异不同的职责节点,萝莉少女不错分派的职责机器ID鸿沟为0~1023。然而 10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。道理便是最多代表 2 ^ 5 个机房(32 个机房),每个机房里不错代表 2 ^ 5 个机器(32 台机器),这里不错爽气拆分,比如拿出4位标记业务号,其他6位手脚机器号。不错爽气组合。

序列号:用于处治合并毫秒内并发生成多个ID的挫折问题,不错相沿每毫秒最多生成4096个ID。12 bit 不错代表的最大正整数是 2 ^ 12 - 1 = 4096,也便是说不错用这个 12 bit 代表的数字来差异合并个毫秒内的 4096 个不同的 id。也便是合并毫秒内合并台机器所生成的最大ID数目为4096

安设

composer require godruoyi/php-snowflake -vvv

浅易使用

id . PHP_EOL;

践诺输出

指定数据中心ID及机器ID

$datacenterId = time;$workerId = '1000000000000001';$snowflake = new \Godruoyi\Snowflake\Snowflake($datacenterId, $workerId);echo $snowflake->id . PHP_EOL;

践诺输出

AV女优

指定运行时分

$snowflake = new \Godruoyi\Snowflake\Snowflake;$snowflake->setStartTimeStamp(strtotime('2020-08-15')*1000);echo $snowflake->id . PHP_EOL;

践诺输出

高档用法

在 Laravel 中使用

可通过底下的神色快速集成到 Laravel 中

// App\Providers\AppServiceProvideruse 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 接口来自界说序列号处治器。

class YourSequence implements SequenceResolver{ /** * {@inheritdoc} */ public function sequence(int $currentTime) { // Just test. return mt_rand(0, 1); }}// usage$snowflake->setSequenceResolver(new YourSequence);$snowflake->id;

你也不错径直使用闭包:

$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。