国内破处 Twitter雪花算法PHP罢了库Snowflake
发布日期:2024-08-15 08:02 点击次数:161国内破处
在漫衍式系统中,生周详局独一的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。