2018年04月6日网站服务器迁移完成……

php采用redis有序集合实现延迟队列

php 苏 demo 413℃

最近在实践小项目的时候,采用redis的有序集合,例如有序集合分数的概念实现了延迟队列的功能。以下是实践练习的代码,仅供学习使用:

示例代码:

<?php
$queueName = 'delay:queue:nts';

while (true)
{
try
{
$queueData = RedisHelper::zRangeByScore($queueName, 0, time(), ['limit' => [0, 1]]);
if (!$queueData)
{
cronOutlog("INFO: no data");
usleep(100000);
}
$task = $queueData['0'];
if (RedisHelper::zRem($queueName, $task))
{
$data = json_decode($task, true);
cronOutlog("INFO:" . $data['task_name'] . " 运行时间:" . formatLongDate().' 内容:'.json_encode($data['body']));
//todo 执行逻辑
}
usleep(100000);
} catch (\Exception $ex)
{
cronOutlog("INFO:异常操作,再次放回队列");
RedisHelper::zAdd($queueName, time() + 5 * 60, json_encode($task, JSON_UNESCAPED_UNICODE));
}
}

推送数据加入延迟队列示例代码:

$queueName = 'delay:queue:nts';
$data = [
'task_name' => time(),
'body' => [
'id' => time(),
'name' => NeoString::getRandString(10)
],
];
RedisHelper::zAdd($queueName, time() + 30, json_encode($data, JSON_UNESCAPED_UNICODE));
打赏

转载请注明:苏demo的别样人生 » php采用redis有序集合实现延迟队列

   如果本篇文章对您有帮助,欢迎向博主进行赞助,赞助时请写上您的用户名。
支付宝直接捐助帐号oracle_lee@qq.com 感谢支持!
喜欢 (9)or分享 (0)