google-cloud-datastore - Google Cloud 数据存储分页

标签 google-cloud-datastore

我们将数据存储在 Google Cloud Datastore 中。我们希望为我们的用户提供 API。
我们的 API 的分页规范与 github API 一样是基于 header 的。我们希望用户使用页面参数。

分页规范

e.g.

Link: <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=15>; rel="next",
  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=34>; rel="last",
  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=1>; rel="first",
  <https://api.github.com/search/code?q=addClass+user%3Amozilla&page=13>; rel="prev"

https://developer.github.com/guides/traversing-with-pagination/

API
End-Users <--- Backend Code (PHP) <--- Google Cloud Datastore

如您所知,Google Cloud Datastore 建议使用游标来提高性能和成本。但是我们不希望最终用户使用游标。最终用户是否有可能使用整数页码而不是游标,并且在后端使用游标?

我们使用 Google 的 PHP 客户端。

https://github.com/google/google-api-php-client-services

最佳答案

我相信你可以通过使用 GQL 来获得类似 OFFSET 的东西,但是这样的操作会花费你很多钱(做相当于 LIMIT 1000, 10 的操作将被视为 1,010 次读取 - 而不仅仅是你实际得到的 10 次)。

降低分页的 OFFSET 成本

假设您的页面大小为 10 个项目,并且用户要求跳转到第 5 页。您需要查询前 40 个实体,获取游标并再次运行查询,现在提供游标并限制为 10 个。

建议在第一个查询中使用 keys_only=True 获取。这样你可以:

  • 省钱,因为只有键的查询被算作查询本身读取的单个实体 (see Datastore pricing info)
  • 有更快的查询(see this benchmark - 页面加载需要一段时间)。
  • 关于google-cloud-datastore - Google Cloud 数据存储分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43310917/

    相关文章:

    python - 如何删除 GAE 中所有 namespace 中的所有实体?

    java - 在 Google App Engine 中,如何在更新 SDK 后保持开发数据存储可用?

    google-app-engine - 我怎样才能在谷歌应用引擎数据存储区中拥有动态属性

    GWT RPC 和持久 Java 对象

    python - GAE 数据存储不刷新

    java - 对象化仅键查询?

    google-cloud-datastore - Google Datastore python 每页返回较少数量的实体

    php - 在数据存储区 PHP API 中获取实体的 ID

    python - AppEngine/Python NDB 键顺序

    java - GWT + GAE 数据存储 key 和文本 Java 错误