mysql - 插入MySQL队列的中间

标签 mysql data-structures queue

我正在制作一个 RSS 阅读器,其中包含定期获取新内容的脚本。每次脚本获取新内容时,它都会从 1 个提要中获取内容。我正在创建一个提要队列,以便每次执行脚本时,它都会弹出队列中的第一个提要。然而,由于某些提要比其他提要更受欢迎,因此处理后的提要可能不会被推送到队列末尾。对于流行的提要,我想将它们排入队列中间,以便更快地再次处理它们。如果我使用带有表示队列顺序的 id 列的 MySQL 表,那么我必须将入队项目后的每个 id 下移。有没有办法在 MySQL 中实现队列,以便我可以在队列中间插入一行而不需要太多开销?

最佳答案

首先让我们放弃在数据库中实现队列的想法,我们可以做得更好。我们不是将每个 feed 的位置保留在队列中,而是存储上次检索的时间(假设列名称为 last_retrieved),然后要获取下一个要更新的 feed,请使用如下查询:

SELECT * FROM feeds ORDER BY last_retrieved ASC LIMIT 1

完成后更新 Feed 的 last_retrieved 字段。那么每次更新只需更新一条记录,而不是全部。

现在,在优先级上,我们要添加一个优先级字段(假设priority,我们将使用整数类型)。现在我们可以为每个优先级运行单独的查询:

SELECT * FROM feeds WHERE priority = 0 ORDER BY last_retrieved ASC LIMIT 1

或者:

SELECT * FROM feeds WHERE priority = 1 ORDER BY last_retrieved ASC LIMIT 1

然后您在代码中根据时间和优先级决定先执行哪一个。

最后,假设您不会不断运行更新并且可以批量检索它们并休眠一段时间,我们可以做得更好:

SELECT * FROM feeds 
    WHERE (priority = 0 AND last_retrieved < time1)
        OR (priority = 1 AND last_retrieved < time2)
        OR (priority = 3 AND last_retrieved < time3)

其中 time1、time2 和 time3 的计算方法为当前时间减去该优先级配置的更新频率。

关于mysql - 插入MySQL队列的中间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21518916/

相关文章:

mysql - 从 db2 制作输出文件显示从 shell 脚本创建表的过程?

php - 显示数据库中存储的图像

c - 对c中的指针进行两次逻辑否定有什么意义?

algorithm - 重复计算百分位数的快速算法?

php - Mysql:如何在行之间交换一列的数据?

php - Doctrine 选择多个对象

c# - 从长度为 M 的未排序数组中搜索前 N 个已排序整数?

Java队列和线程安全

azure - 使用 Azure 仪表板查看队列内容

c++ - 为什么 front() 返回的值在 std::queue 的 pop() 之后仍然存在?