Search by

fiberphp / snowflake

fiberphp

❄️ FiberPHP 雪花算法 —— 分布式唯一 ID 生成,Redis Worker ID 租约分配,趋势递增,零依赖纯库。

Package info

gitee.com/fiberphp/snowflake.git

Issues

pkg:composer/fiberphp/snowflake

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

dev-master 2026-09-09 05:55 UTC

This package is auto-updated.

Last update: 2026-09-09 05:55:28 UTC


README

分布式唯一 ID 生成器,基于雪花算法,零框架依赖的纯库实现。10 位 workerId + 12 位序列号,单节点每毫秒可产出 4096 个 ID;未指定 workerId 时通过 Redis SETNX 租约自动分配,并随 nextId 惰性续期。

环境要求

  • PHP >= 8.3
  • 自动分配 workerId 时需注入 Redis 连接对象(支持 set / eval / expire,如 fiberphp/redis 的 sync 连接或原生 \Redis

安装

composer require fiberphp-ext/snowflake

快速开始

use FiberPHP\Snowflake\Snowflake;

// 方式一:显式指定 workerId(单节点 / 自行分配时)
$snowflake = new Snowflake(['worker_id' => 1, 'epoch' => 1704067200000]);

$id = $snowflake->nextId();
// 1234567890123456789

// 批量生成
$ids = $snowflake->nextIds(1000);

Redis 自动分配 workerId

未指定 worker_id 时,构造第二参数传入 Redis 连接,自动用 SETNX + TTL 抢占空闲槽位(0~1023):

$snowflake = new Snowflake(
    ['epoch' => 1704067200000, 'worker_ttl' => 30],
    $redis,  // Redis sync 连接对象
);

$id = $snowflake->nextId();  // 内部随每次调用惰性续期租约

// 优雅关闭时释放 workerId
$snowflake->releaseWorkerId();

配置说明

参数默认值说明
epoch1704067200000起始时间戳(毫秒),所有 ID 基于此点计算
worker_idnull显式 workerId(0~1023);为空则走 Redis 自动分配
worker_ttl30Redis 租约有效期(秒),过期未续期则槽位被回收
clock_back_tolerance5时钟回拨容忍阈值(毫秒),超出抛 RuntimeException

特性

能力说明
趋势递增时间戳高位,单节点 ID 单调递增,索引友好
Redis 租约SETNX 抢占 workerId + Lua 原子续期,归属校验防误续他人租约
时钟回拨保护小幅回拨等待对齐,超阈值抛异常 fail-fast
惰性心跳每次 nextId 自动续期,无需外部定时器
解析能力parseTimestamp / parseWorkerId 从 ID 还原元信息

License

MIT License (c) 2026 庞斌,详见 LICENSE