Files
huangjingfen/pro_v3.5.1/vendor/godruoyi/php-snowflake/src/RedisSequenceResolver.php
apple 78de918c37 Initial commit: queue workspace
Made-with: Cursor
2026-03-21 02:55:24 +08:00

73 lines
1.3 KiB
PHP

<?php
/*
* This file is part of the godruoyi/php-snowflake.
*
* (c) Godruoyi <g@godruoyi.com>
*
* This source file is subject to the MIT license that is bundled.
*/
namespace Godruoyi\Snowflake;
use Redis;
use RedisException;
class RedisSequenceResolver implements SequenceResolver
{
/**
* The redis client instance.
*
* @var Redis
*/
protected $redis;
/**
* The cache prefix.
*
* @var string
*/
protected $prefix;
/**
* Init resolve instance, must connectioned.
*/
public function __construct(Redis $redis)
{
if ($redis->ping()) {
$this->redis = $redis;
return;
}
throw new RedisException('Redis server went away');
}
/**
* {@inheritdoc}
*/
public function sequence(int $currentTime)
{
$lua = <<<'LUA'
if redis.call('set', KEYS[1], ARGV[1], "EX", ARGV[2], "NX") then
return 0
else
return redis.call('incr', KEYS[1])
end
LUA;
// 10 seconds
return $this->redis->eval($lua, [$this->prefix.$currentTime, '0', '10'], 1);
}
/**
* Set cache prefix.
*/
public function setCachePrefix(string $prefix)
{
$this->prefix = $prefix;
return $this;
}
}