我正在制作一个 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/