有人知道可用于重新索引所有/某些命名空间中的所有/某些实体的库或良好的代码示例吗?
如果我自己实现这个,我应该考虑 MapReduce 吗?
“我需要重新索引吗?”感觉就像许多开发人员都遇到过的问题,但我能找到的最接近的是 this ,这可能是一个好的开始?
其他选项是使用任务队列的自制解决方案,该任务队列迭代数据存储 namespace 和实体,但我不希望重新发明轮子并寻求一个强大的、经过验证的解决方案。
有哪些选项?
最佳答案
恐怕我不知道有任何预建系统。我认为您基本上需要创建一个游标来迭代所有实体,然后对所有实体执行 get 和 put (或者可以选择在执行 put 之前检查它们是否在索引中 - 如果您有一些实体会这样做)不需要更新,这会以读取和/或小操作为代价节省写入次数)。
请按照此处的示例操作: https://code.google.com/p/objectify-appengine/wiki/IntroductionToObjectify#Cursors
- 创建 java.util.concurrent.SynchronousQueue 来保存批量数据存储区 key 。
- 使用 ThreadManager 创建 10 个新的消费者线程(当前限制):
https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/ThreadManager
这些线程应该执行以下操作:
- 创建一个新的 objectify 实例并关闭 objectify 的 session 缓存和内存缓存。
- 从 SynchronousQueue 中获取一批 key 。
- 使用批量获取来获取所有这些实体。
- 可以选择使用相关属性对所有这些实体执行仅键查询。
- 放入所有这些实体(或排除上面返回的实体)。
- 重复第 2 步。
- 在循环中,使用仅键游标查询获取接下来的 30 个键,并将它们放入 SynchronousQueue 中。
- 将所有项目放入 SynchronousQueue 后,设置一个属性以在所有使用者线程完成工作后停止它们。
关于java - AppEngine Java 重新索引任务/映射器/作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15258246/