【问题标题】:php implememnt a queue with redisphp 用 redis 实现一个队列
【发布时间】:2015-05-07 09:31:04
【问题描述】:

我使用redis写了一个非常简单的队列,但是我觉得我的实现很糟糕,所以我想请求一个更好的解决方案。下面是我的问题的简单流程图。

  1. 某些程序将数据推送到 redis 列表中
  2. 一个php程序永远循环,检查列表是否为空,如果不为空则将列表中的节点弹出到MySQL中。

第 1 步很好,但是我在第 2 步中使用了while (true),这会导致大量 CPU 浪费。有什么好办法可以在list不为空的情况下进行pop操作?

【问题讨论】:

  • while(true) 真的会造成 CPU 浪费吗? cpu浪费是什么意思?
  • 您可以将 sleep() 添加到循环中
  • 当永远循环时,cpu 使用率会非常高,sleep() 是一个解决方案,但是任何更聪明的方法可以检测列表是否为空?

标签: php mysql redis


【解决方案1】:

执行 cron 作业,而不是为第 2 步执行无限循环

【讨论】:

    【解决方案2】:

    设置 cron 作业以定期检查列表并将值弹出到您的 MySql 表中。我读到您的一个 cmets 说您不喜欢 cron 作业,所以请考虑一下我所说的 'poor mans cron',这是用词不当,因为 cron 作业的唯一成本是服务器访问......

    只需设置一个时间值和一个阈值。 if(now() - timeValue > threshold){ 做你的流行到 MySql 的事情......

    这是一种罕见的情况,你想在 php 中进行无限循环,恕我直言。这里有一些讨论:When are infinite loops are useful in PHP?

    【讨论】:

    • 我讨厌 cron,因为很难维护很多 cron 作业,我更喜欢通过程序而不是系统来完成这项工作,比如使用 laravel 的时间表。而且你的阈值类似于 sleep();
    • no no no,主要区别在于如果不满足阈值,则不执行条件逻辑。检查特定时间是否已过与 PHP 完全停止处理一段时间不同。 sleep 会导致挂起。或许在10秒的情况下,sleep可能就ok了。我仍然会避免。
    【解决方案3】:

    最简单的解决方案:

    while (true) {
     if ($res = fetch(data)) {
      //do your staff
     } else {
      sleep(10);
     }
    }
    

    但是长时间运行 PHP 脚本可能会导致内存泄漏,所以最好的方法可能是 cronjob,脚本如下:

    //do not forget to check if process is already running, not to run duplicate processes.
    

    您可以尝试以下解决方案: Checking if process still running?

    while ($res = fetch(data)) {
     //do your staff
    }
    

    【讨论】:

    • 我讨厌crons,所以我会尝试使用另一个程序来检查这个php程序是否正在运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2020-03-11
    • 2015-07-06
    • 1970-01-01
    • 2020-06-30
    • 2019-01-02
    相关资源
    最近更新 更多