ada-u/chocoflake

64位基于时间的ID生成器


README

Build Status Github Actions Coverage Status

PHP的64位ID生成器

chocoflake 是Twitter Snowflake算法的实现。在分布式环境中,它可以根据时间生成ID。

使用方法

先决条件

  • PHP 8.0 或更高版本

安装

命令

$ composer.phar require ada-u/chocoflake:dev-master

composer.json

{
  "require": {
    "ada-u/chocoflake": "dev-master"
  }
}
$ composer.phar install

示例

配置

  • 41位 - 用于时间戳
  • 5位 - 用于区域ID
  • 5位 - 用于服务器ID
  • 12位 - 用于每毫秒的序列
  • 1414334507356 - 服务启动纪元(Unix时间戳)
$config = new IdConfig(41, 5, 5, 12, 1414334507356);
$service = new ChocoflakeService($config);

$worker = $service->createIdWorkerOnSharedMemory(new RegionId(1), new ServerId(1));

$id = $worker->generate();
4194439168

ID生成器

我实现了两种ID生成器,Redis和共享内存版本。

共享内存版本

使用共享内存和信号量(作为互斥锁)来防止多个进程同时处于关键部分。

Redis版本

使用Redis原子增量操作来计数序列。

ID规范

ID由四个元素组成

  • 时间戳
  • 区域ID
  • 服务器ID
  • 序列

您可以指定每个元素的任何位长度。

测试

$ docker-compose run php vendor/bin/phpunit
Creating chocoflake_php_run ... done
PHPUnit 9.5.6 by Sebastian Bergmann and contributors.

....                                                                4 / 4 (100%)

Time: 00:00.353, Memory: 6.00 MB

OK (4 tests, 4 assertions)

许可协议

本软件按照MIT许可证发布,请参阅LICENSE。