danfekete/sequential

序列ID生成器

0.3.2 2016-10-28 13:19 UTC

This package is auto-updated.

Last update: 2024-09-25 22:13:33 UTC


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) - 返回给定桶生成的最后一个ID
  • store(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);