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

76 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
* @param Consumer $consumer
* @return false|int
* @throws ComponentException
* @throws Exception
*/
protected function pop($key, Consumer $consumer)
{
$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) {
return $redis->unlink($hash);
}
$redis->zRem($key, $serialize);
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
}
}
}