我有一个以下架构问题 - 我的应用程序后端是在Java和客户端编写的AngularJS。现在我需要在页面上存储用户输入,以便能够共享和标记我的应用程序URL并通过此URL恢复状态。
我将实现以下方法 - 每次用户通过选择页面上的数据和条件与我的应用程序交互时,我将在复杂的JSON文档中收集他的所有输入并存储此Elasticsearch的文件。来自ES的本文档的密钥我将发送回客户端应用程序(AngularJS),并根据此密钥更新页面URL。例如,原始网址如下:
http://example.com/some-page
根据服务器I的密钥更新此网址:
http://example.com/some-page/analysis/234532453455
其中234532453455
是ES中文档的关键字。
每次用户尝试访问以下网址时,http://example.com/some-page/analysis/234532453455
AngularJS应用程序将尝试通过密钥(234532453455)通过Java后端REST端点获取保存状态。
它会起作用吗?
另外,我现在对如何防止ES中的文档重复表示怀疑。现在我没有使用ES的经验,所以不知道ES可以用什么方法开箱即用。
例如,计算每个JSON文档的一些哈希代码并将此哈希代码存储为文档的密钥是个好主意..因此,在存储新文档之前,我可以通过哈希代码检查旧文档。性能对我来说也很重要,所以请同时考虑这一点。
答案 0 :(得分:1)
对我来说,听起来你试图实现缓存。
是的,您可以这样做,但如果您只将ES用于此解决方案,那么我认为您应该更好地关注redis或memcached。
我不能说ES是一个糟糕的解决方案,但ES有一些技巧,你必须记住它的near realtime search。索引数据后,它们无法立即搜索,只需几秒钟取决于配置(但您也可以调用_refresh但如果您经常索引数据,我不确定性能。)
哈希:我没有看到使用的理由,我最好创建正确的ID。因此,如果您有每个用户的报告类型而不是ID可能是“reporttype_ {userid}”,因为如果您将使用哈希作为ID,那么每个新对象将具有新的ID而不是重写您将最终为该用户提供了许多旧数据副本。如果您使用模式reporttype_ {userid},则每次用户使用新数据重新生成报告时,您只需覆盖它。作为一个选项,您可以添加该选项字段用户ID 和 expireat 以供将来清理,例如,您可以拥有清除过期报告的作业,但这是有效的只有当你使用ES时,因为在redis和memcached中可以选择在保存数据时设置过期