【问题标题】:Is there a way to cache database entries for specific users in Flask有没有办法在 Flask 中为特定用户缓存数据库条目
【发布时间】:2020-09-11 23:35:55
【问题描述】:

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

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

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

【问题讨论】:

  • 我会注意到许多网站(包括这个!)都存在这个问题,并且不要尝试解决它。除非有人真的用新内容向您的应用程序发送垃圾邮件,否则这只会带来轻微的不便。您可以维护某种状态(例如,最后看到的内容的 id)并使用它来限制来自数据库的结果,但这在实践中可能会被证明很棘手或性能不佳。
  • 为了防止这种情况,一些网站在客户端动态加载数据。因此,当您的用户浏览时,顶部会显示更多内容,而无需重新加载页面。这不会解决问题,但会让用户明白为什么他们会在下一页看到相同的内容。

标签: python python-3.x flask flask-sqlalchemy python-3.8


【解决方案1】:

一种潜在的解决方法是基于光标的分页。在大多数分页问题中,询问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 号并被截断,但它并不严格小于 posted_at 10 号发布日期。

一种解决方法是使用ids,如果你能保证它们总是增加的话。因此,如果拥有更高的 ID 意味着 总是 它也较新,那么您可以这样做。否则,您也可以使用id posted_at 的组合。这样,ids 是否增加并不重要,因为它使订单具有确定性。我的意思是,如果您有两个posted_at 时间相同的帖子,但B 的id 比A 高,那么如果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

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多