danfekete / sequential
序列ID生成器
0.3.2
2016-10-28 13:19 UTC
Requires
- php: >=5.6
- illuminate/support: 5.3.*
- malkusch/lock: 1.0.*
- symfony/event-dispatcher: ^2.8
README
这个库是SeqDB引擎的继任者。这个库的整个目的就是能够在并行运行时,生成真正的序列ID到桶中。
有时候,你需要确保在顺序生成ID时,没有间隙或重复。
安装
$ composer require danfekete/sequential
用法
框架无关
你不需要底层框架来使用这个库。
$data = new SQLite(); $seq = new Sequential($data); $bucket = new Bucket($userID); $nextID = $seq->generate($bucket);
在 Laravel 5.2+ 中使用
使用 composer 安装后运行
$ php artisan vendor:publish --provider=danfekete\Sequential\SequentialServiceProvider
之后,你应该能在你的 config
目录中看到 sequential.php
文件。进行必要的调整(但也可以直接使用默认配置)。
在你的 config/app.php
中添加以下内容
'providers' => [ // ... danfekete\Sequential\SequentialServiceProvider::class, // ... ]; 'aliases' => [ // ... 'Sequential' => danfekete\Sequential\SequentialFacade::class, // ... ];
生成ID
$bucket = new Bucket($userID); $nextID = Sequential::generate($bucket);
配置
当使用 Laravel 时,配置在 sequential.php
文件中完成,否则在构造函数中完成。
dataProvider
(在构造函数中) - 实现了DataProdvider
接口的数据对象,关于数据提供者的更多信息稍后介绍data_provider_class
(在 Laravel 配置中) - 实现DataProvider
接口类的完全限定名称sharedMutex
- 如果为true
,则互斥锁与每个桶共享,意味着在任何给定时刻,只有一个ID生成操作发生,无论桶如何。否则,每个桶可以同时运行ID生成操作,这是默认行为。incrementBy
- 生成新ID时增加的量
数据提供者
数据提供者实现了 DataProvider
接口。该接口有三个必须实现的方法
getLastID(Bucket $bucket)
- 返回给定桶生成的最后一个IDstore(Bucket $bucket, $value)
- 为桶存储值reset(Bucket $bucket)
- 将桶的值重置为0
你可以使用默认的 SQLite 数据提供者,或者你可以用任何类型的复杂逻辑创建自己的数据提供者。桶可以包含任何数量的数据,可用于查询最后一个ID。
分布式使用
序列ID生成中难度最大的一部分是分布式使用。为此,有一个主类叫做 DistributedSequential
的专用版本,它使用 Redis 的 RedLock DLM 算法。你需要一个额外的 Redis 服务器来使用它,还需要 Predis 库。
$c1 = new Predis\Client('tcp://10.0.0.1:6379'); $c2 = new Predis\Client('tcp://10.0.0.2:6379'); $data = new SQLite(); $seq = new DistributedSequential([$c1, $c2], $data); $bucket = new Bucket($userID); $nextID = $seq->generate($bucket);