繁体   English   中英

在会话中存储数据,如何以及何时检测数据是否陈旧

[英]Store data in session, how and when to detect if data is stale

我有这种情况。

  1. 用户进行搜索
  2. 处理程序找到结果,存储在会话中
  3. 用户查看结果,决定单击其中之一查看
  4. 查看后,用户单击“返回搜索”
  5. 处理程序检测到其返回搜索,跳过搜索,而是从会话中检索
  6. 用户看到与预期相同的结果

在#5,如果创建了一个新项目并符合用户的搜索条件,则它应成为结果的一部分。 但是由于在#5中,我只是从会话中检索,因此不会检测到它。

我的问题是,我应该额外进行检查吗? 如果是这样,如何在不进行实际检索的情况下有效地进行检查(这会违背目的)? 也许选择count(*)....并将其与会话中结果集的计数进行比较?

这取决于您的业务需求。 如果必须让用户获得最新的结果,则必须重新推定它们。

计数不会是100%,因为可能会有相应的删除。

您也许可以比较时间戳记或其他内容,但我怀疑所涉及的所有复杂性只会带来更多问题。

保持简单,然后重新运行搜索。

我强烈建议不要在会话中缓存某些搜索结果。 Web应用程序应努力使会话状态最小。 放入一揽子逻辑来针对用户会话状态缓存搜索结果(至少至少几个kb)实际上是在询问内存问题。

相反,您应该具有一个管理其自己的缓存的单例搜索服务。 尽管这在策略上看起来类似于在会话内部进行缓存,但是它具有几个优点:

  • 您可以在用户之间重复使用常见的搜索结果; 根据搜索类型,这可能很重要
  • 您可以在服务层中管理缓存大小; 诸如ehcache之类的东西易于实现,并为您提供了许多可配置性(并提供了针对内存不足问题的保护)
  • 您可以在服务层中管理缓存有效性; 即,如果“更新项目”服务已触发了其save()方法,则它可以告诉搜索服务使整个缓存或与新更新/创建的项目相对应的缓存结果无效。

上面的第三点解决了您的主要问题。

为了查看是否有新商品,您可能不得不重新运行搜索-甚至只是为了计数。

您正在有效地缓存搜索结果。 因此,正常答案是要么在设定的时间后使结果过期(例如,结果仅在1分钟内有效),要么使系统具有以下功能:在更改数据时,缓存无效,导致搜索必须再次运行。

到用户回到那里时,可能会有任何新结果吗? 您可以在搜索结果页面上放置一个“刷新”按钮,以使搜索再次运行。

您期望数据库项目中的刷新率是什么? 即使在很短的间隔内,搜索结果是否也会发生巨大变化,因为我不知道这种情况,但是情况可能会有所不同。

假设您有一个场景,其中数据库由一个或多个单独的线程填充,并且您有另一个独立的线程来搜索结果,请跟踪缓存中已插入数据库中的最新项的时间戳。

现在,当用户希望再次查看搜索结果时,将时间戳进行比较,即将缓存的时间戳与插入数据库的最后一项的时间戳进行比较。 如果没有匹配项,则重新查询,否则从您的缓存中显示。

如果您的情况证实了我的假设,即数据库的更新频率不是太高(写给特定的搜索词或条件),那么这可以避免您过于频繁地查询数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM