我的场景是这样的。
- 用户进行搜索
- 处理程序查找结果,存储在 session 中
- 用户看到结果,决定点击其中一个进行查看
- 查看后,用户点击“返回搜索”
- 处理程序检测到其返回搜索,跳过搜索并从 session 中检索
- 用户看到的结果与预期相同
在#5,如果创建了一个新项目并且符合用户的搜索条件,那么它应该成为结果的一部分。但由于在 #5 中我只是从 session 中检索它不会检测到它。
我的问题是,我应该进行额外的检查步骤吗?如果是这样,如何在不进行实际检索的情况下进行有效检查(这会达不到目的)?也许可以选择 count(*) .... 并将其与 session 中结果集的计数进行比较?
最佳答案
我强烈建议不要在 session 中缓存某些搜索结果。 Web 应用程序应努力拥有尽可能最小的 session 状态。放入总括逻辑来根据用户 session 状态缓存搜索结果(大概至少有几个 kb)实际上会带来内存问题。
相反,您应该有一个管理自己的缓存的单例搜索服务。尽管这在策略上看起来与 session 内缓存相似,但它有几个优点:
- 您可以重复使用用户之间常见的搜索结果;根据搜索类型,这可能很重要
- 您可以在服务层管理缓存大小;像 ehcache 这样的东西很容易实现,并为您提供大量的可配置性(并防止内存不足问题)
- 可以在服务层管理缓存有效性;即,如果“更新项目”服务已触发其 save() 方法,它可以告诉搜索服务使其整个缓存无效或仅使与新更新/创建的项目相对应的缓存结果无效。
上面的第三点解决了您的主要问题。
关于java - 在 session 中存储数据,如何以及何时检测数据是否过时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6935698/