从app引擎数据存储区选择随机记录(java)

时间:2014-09-27 16:51:58

标签: java google-app-engine jpa google-cloud-datastore

我使用GAE和Java(JPA)从我的数据库中检索记录。

此刻我有超过2000条记录(并且还在增长),我必须显示60条完全随机的记录。 目前我已按以下方式实施

  1. 从数组中获取所有密钥
  2. 在0 <0之间生成60个随机整数。指数&lt;大小(keys_array)
  3. 按键值获取这60条记录
  4. 我在这个实现中面临的问题是,因为每个请求都下载了整个数据库集,所以它在“数据存储小型操作”中增加了很多。 (免费)qouta,如果这个代码将来要扩展,那么感觉效率低下。

    如何在不下载所有密钥的情况下获取随机60条记录?

5 个答案:

答案 0 :(得分:3)

  1. 您可以记忆所有2000个密钥,这样您就不必在每个请求中查询它们。

  2. 您可以以每个用户获得独特的随机结果的方式记录60条随机记录,这些结果已经显示给以前的用户(可能不适用于您的情况)。

  3. 但这些都不是可扩展的。

答案 1 :(得分:2)

取决于。三种解决方案,其中没有一种可能是理想的:

  • 如果您可以使用连续数字作为键(如果您已经拥有其他商业ID,则可以添加第二个键),在Java中生成随机密钥并按ID进行查询。
  • 尝试ORDER BY RAND()并获得前60个结果,但这不可移植,因为RAND或RANDOM不属于JPA规范。
  • 选择所有记录并使用EntityManager.setFirstResult (random).setMaxResults (1)滚动到随机行并重复60次。

答案 2 :(得分:1)

有一个特殊的属性应用于名为__scatter__的实体,地图缩减框架用于样本实体。

It is mentioned in the javadoc here

我实际上无法找到有关其工作原理/何时应用的信息,但是在数据存储区查看器中运行查询似乎会产生结果。然而,并非所有实体都具有此属性。

您可以尝试执行以下操作,看看它是如何实现的:

SELECT * FROM Kind order by __scatter__

答案 3 :(得分:1)

首次部署代码时,请获取当前unix时间戳的常量。然后对每条记录保存另一列,这是当前的unix时间戳。现在每次查询随机记录时,都会在常量时间戳和当前时间戳之间生成随机unix时间戳,并获取按生成的随机数排序的记录。

答案 4 :(得分:0)

我认为有两个选项,首先你可以缓存密钥,而且第一次只需要时间。

其次,您可以在查询中使用随机来获取任何随机记录

相关问题