Files
kiri-core/Queue/Abstracts/Queue.php
T

75 lines
1.4 KiB
PHP
Raw Normal View History

2020-09-10 19:26:42 +08:00
<?php
namespace Queue\Abstracts;
use Exception;
use Queue\Consumer;
use Snowflake\Abstracts\Component;
use Snowflake\Exception\ComponentException;
use Snowflake\Snowflake;
/**
* Class Queue
* @package Queue\Abstracts
*/
abstract class Queue extends Component implements Relyon
{
/**
* @param string $key
* @param Consumer $consumer
* @param int $score
* @return false|int
* @throws ComponentException
* @throws Exception
*/
protected function push(string $key, Consumer $consumer, $score = 0)
{
$redis = Snowflake::app()->getRedis();
2020-09-11 01:25:43 +08:00
try {
$serialize = serialize($consumer);
if (!$redis->lock($hash = md5($serialize))) {
return false;
}
$isExists = $redis->zRevRank($key, $serialize);
if ($isExists !== null) {
$redis->zAdd($key, $score, $serialize);
}
return $redis->unlink($hash);
} finally {
$redis->release();
2020-09-10 19:26:42 +08:00
}
}
/**
* @param $key
2020-09-11 15:01:22 +08:00
* @param string $consumer
2020-09-10 19:26:42 +08:00
* @return false|int
* @throws ComponentException
* @throws Exception
*/
2020-09-11 15:01:22 +08:00
protected function pop($key, string $consumer)
2020-09-10 19:26:42 +08:00
{
$redis = Snowflake::app()->getRedis();
2020-09-11 01:25:43 +08:00
try {
2020-09-11 15:01:22 +08:00
if (!$redis->lock($hash = md5($consumer))) {
2020-09-11 01:25:43 +08:00
return false;
}
2020-09-11 15:01:22 +08:00
$isExists = $redis->zRevRank($key, $consumer);
2020-09-11 01:25:43 +08:00
if ($isExists === null) {
return $redis->unlink($hash);
}
2020-09-11 15:01:22 +08:00
$redis->zRem($key, $consumer);
2020-09-10 19:26:42 +08:00
return $redis->unlink($hash);
2020-09-11 01:25:43 +08:00
} finally {
$redis->release();
2020-09-10 19:26:42 +08:00
}
}
}