python - 有没有办法在 Flask 中为特定用户缓存数据库条目
问题描述
所以我正在帮助为一个应用程序制作一个 Flask API,它允许用户与其他人分享他们在应用程序上所做的创作。我们想要实现的一件事是让用户按照上传到服务器的最新作品进行排序。目前,我们只是让 API 按上传时间对结果进行排序,并对这些结果进行分页。
问题是,如果用户请求获取最新作品的第 1 页,并且在那里停留足够长的时间以便将更多内容上传到服务器,那么在转到第 2 页之前,一些作品可能会被推回,从而导致用户不止一次看到同一件事。解决这个问题的最佳方法是什么?
抱歉,如果这不清楚,或者标题不准确。我很难用语言表达这个问题,所以如果需要,我很乐意尝试澄清。
解决方案
一个潜在的解决方法是基于光标的分页。在大多数分页问题中, 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
日期。
一种解决方法是使用id
s,如果你能保证它们总是增加的话。因此,如果拥有更高的 ID 意味着它总是更新的,那么你可以这样做。否则,您也可以使用 和 的id
组合 posted_at
。这样,id
s 是否增加并不重要,因为它使顺序具有确定性。我的意思是,如果您有两个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
推荐阅读
- c# - 传递给 AES init 的 BouncyCastle 无效参数
- reactjs - 如何使用仪表板和电子商务页面管理 reactjs 中的路由?
- r - 在 R 中制作像 roc.glmnet 这样的 roc 曲线
- sql - 为什么我的组没有按预期对我的值进行分组?
- java - 如何避免混淆 Firebase 模型字段?
- vue.js - 创建构建后。运行构建时显示空白页
- snowflake-cloud-data-platform - 永久更改 JSON SNOWFLAKE 中的列名
- c# - 来自代码后面的 WPF CommandParameter 值
- ios - Swift 的 Dispatchqueue 和 Flutter 的 Future 有什么区别?
- javascript - 如何在 JavaScript 中将对象转换为 text/csv 并下载为 CSV?