php 实现bucket类
php基于Redis实现Bucket类,Redis的 List 类型适合做先入先出的容器逻辑。因此,基于Redis List来创建 Bucket 类。使用了共享锁及Redis事务,保证并发执行的唯一性。
初始化bucket List数据,bucket已用容量,bucket最大容量。
构造函数
public function __construct(IBucketConfig $config)参数说明
| 参数 | 说明 |
|---|---|
| config | Redis Bucket组件配置 |
调用例子
// redis连接设定
$config = array(
'host' => 'redis',
'port' => 6379,
'index' => 0,
'auth' => '',
'timeout' => 1,
'reserved' => NULL,
'retry_interval' => 100,
);
// 定义bucket名称
$bucket = 'my-bucket';
// 创建bucket配置对象
$redisBucketConfig = new \Bucket\RedisBucketConfig;
$redisBucketConfig->setConfig($config);
$redisBucketConfig->setName($bucket);
// 创建bucket组件对象
$redisBucket = \Bucket\BucketFactory::make(\Bucket\Type::REDIS, $redisBucketConfig);方法
public function init(): void将队列清空,最大容量,已用容量为0
方法
public function push(string $data, int $is_force_pop = 0): Response请求参数
| 参数 | 说明 |
|---|---|
| data | 压入的数据(string) |
| is_force_pop | 是否强制弹出数据(已满的情况),默认不弹出 |
返回格式
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[used_size] => 1
[force_pop_data] => Array
(
)
)
)返回格式(强制弹出)
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[used_size] => 3
[force_pop_data] => Array
(
[0] => a
)
)
)方法
public function pop(int $num = 1): Response请求参数
| 参数 | 说明 |
|---|---|
| num | 弹出数据数量 |
返回格式
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[0] => b
[1] => c
[2] => d
)
)方法
public function setMaxSize(int $size): Response请求参数
| 参数 | 说明 |
|---|---|
| size | 最大容量 |
返回格式
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
)
)返回格式(强制弹出)
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[0] => e
)
)方法
public function maxSize(): int返回格式
1方法
public function usedSize(): int返回格式
1方法
public function setLockTimeout(int $lock_timeout): void请求参数
| 参数 | 说明 |
|---|---|
| lock_timeout | 锁过期时间(毫秒) |
返回格式
bool(true)方法
public function setTimeout(int $timeout): void请求参数
| 参数 | 说明 |
|---|---|
| timeout | 执行超时时间(毫秒) |
返回格式
bool(true)方法
public function setRetryTime(int $time): void请求参数
| 参数 | 说明 |
|---|---|
| time | 重试间隔时间(毫秒) |
返回格式
bool(true)require 'autoload.php';
// redis连接设定
$config = array(
'host' => 'redis',
'port' => 6379,
'index' => 0,
'auth' => '',
'timeout' => 1,
'reserved' => NULL,
'retry_interval' => 100,
);
// 定义bucket名称
$bucket = 'my-bucket';
// 创建bucket配置对象
$redisBucketConfig = new \Bucket\RedisBucketConfig;
$redisBucketConfig->setConfig($config);
$redisBucketConfig->setName($bucket);
// 创建bucket组件对象
$redisBucket = \Bucket\BucketFactory::make(\Bucket\Type::REDIS, $redisBucketConfig);
// 初始化
$redisBucket->init();
// 设置最大容量
$redisBucket->setMaxSize(3);
// 设置锁超时时间
$redisBucket->setLockTimeout(300);
// 设置执行超时时间
$redisBucket->setTimeout(2000);
// 设置重试间隔时间
$redisBucket->setRetryTime(10);
// 压入3条数据
$response = $redisBucket->push('a');
print_r($response);
$response = $redisBucket->push('b');
print_r($response);
$response = $redisBucket->push('c');
print_r($response);
// 查看已使用容量及最大容量
var_dump(assert($redisBucket->usedSize()==3));
var_dump(assert($redisBucket->maxSize()==3));
// 压入1条数据,不强制弹出,容器已满
$response = $redisBucket->push('d');
print_r($response);
// 压入1条数据,强制弹出
$response = $redisBucket->push('d', 1);
print_r($response);
// 设置最大容量为5,比已用容量大,不用弹出数据
$response = $redisBucket->setMaxSize(5);
print_r($response);
// 压入2条数据
$redisBucket->push('e');
$redisBucket->push('f');
// 查看已使用容量及最大容量
var_dump(assert($redisBucket->usedSize()==5));
var_dump(assert($redisBucket->maxSize()==5));
// 弹出3条数据
$response = $redisBucket->pop(3);
print_r($response);
// 查看已使用容量及最大容量
var_dump(assert($redisBucket->usedSize()==2));
var_dump(assert($redisBucket->maxSize()==5));
// 设置最大容量为1,比已用容量小,弹出数据
$response = $redisBucket->setMaxSize(1);
print_r($response);
// 查看已使用容量及最大容量
var_dump(assert($redisBucket->usedSize()==1));
var_dump(assert($redisBucket->maxSize()==1));输出
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[used_size] => 1
[force_pop_data] => Array
(
)
)
)
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[used_size] => 2
[force_pop_data] => Array
(
)
)
)
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[used_size] => 3
[force_pop_data] => Array
(
)
)
)
bool(true)
bool(true)
Bucket\Response Object
(
[error:Bucket\Response:private] => 1
[data:Bucket\Response:private] => Array
(
)
)
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[used_size] => 3
[force_pop_data] => Array
(
[0] => a
)
)
)
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
)
)
bool(true)
bool(true)
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[0] => b
[1] => c
[2] => d
)
)
bool(true)
bool(true)
Bucket\Response Object
(
[error:Bucket\Response:private] => 0
[data:Bucket\Response:private] => Array
(
[0] => e
)
)
bool(true)
bool(true)


