首页 > 解决方案 > 有没有办法在 Flask 中为特定用户缓存数据库条目

问题描述

所以我正在帮助为一个应用程序制作一个 Flask API,它允许用户与其他人分享他们在应用程序上所做的创作。我们想要实现的一件事是让用户按照上传到服务器的最新作品进行排序。目前,我们只是让 API 按上传时间对结果进行排序,并对这些结果进行分页。

问题是,如果用户请求获取最新作品的第 1 页,并且在那里停留足够长的时间以便将更多内容上传到服务器,那么在转到第 2 页之前,一些作品可能会被推回,从而导致用户不止一次看到同一件事。解决这个问题的最佳方法是什么?

抱歉,如果这不清楚,或者标题不准确。我很难用语言表达这个问题,所以如果需要,我很乐意尝试澄清。

标签: pythonpython-3.xflaskflask-sqlalchemypython-3.8

解决方案


一个潜在的解决方法是基于光标的分页。在大多数分页问题中, ask give me 10 items, starting from item number 100,你会得到这样的 SQL 查询

SELECT *
FROM posts
...
ORDER BY posted_at DESC
LIMIT 10
OFFSET 100

此查询获取所有帖子,对其排序,减去前 100 个值,然后应用 LIMIT 以仅获取 10 行。现在,如果有很多新帖子,这可能会导致第 1 页弹出帖子,然后当您转到第 2 页时,您会再次看到相同的帖子。为什么?数据库中有一个新帖子,将这个帖子推到第 11 位,从而推到第二页。另一个问题是对于更远的页面(比如 100、1000)会变慢。

使用基于光标的分页,您可以删除转到特定页面的功能,只允许人们转到下一页上一页。不同之处在于您将posted_at页面上最后一项的日期与请求一起发送,这实际上变成了give me the first 10 items posted before date x.

在 SQL 中:

SELECT *
FROM posts
...
WHERE posted_at < '2020-09-01 00:00:05'
ORDER BY posted_at DESC
LIMIT 10

这有一个小问题。如果两个帖子同时发布,则此人可能会错过一个,如果它是第 1 页的第 11 号并被截断,但它并不严格小于帖子10的posted_at日期。

一种解决方法是使用ids,如果你能保证它们总是增加的话。因此,如果拥有更高的 ID 意味着它总是更新的,那么你可以这样做。否则,您也可以使用 和 的id 组合 posted_at。这样,ids 是否增加并不重要,因为它使顺序具有​​确定性。我的意思是,如果您有两个posted_at 时间相同的帖子,但B 的发布时间高于idA,那么如果A 是此页面上的最后一个,它将始终显示在下一页上。SQL:

SELECT *
FROM posts
...
WHERE (posted_at < '2020-09-01 00:00:05'
   OR (posted_at = '2020-09-01 00:00:05' AND id > 1500))
ORDER BY posted_at DESC, id
LIMIT 10

推荐阅读