我的情景就是这个。
在#5,如果创建了一个新项目并符合用户的搜索条件,那么它应该是结果的一部分。但是因为在#5中我只是从会话中检索它不会检测到它。
我的问题是,我应该做一个额外的检查步骤吗?如果是这样,如何有效地检查而不进行实际检索(这会破坏目的)?也许选择count(*)....并将其与会话中结果集的计数进行比较?
答案 0 :(得分:2)
这取决于您的业务需求。如果用户必须拥有最新的最新结果,那么您将不得不重新生成它们。
计数不会是100%,因为可能会有相应的删除。
您可能能够比较时间戳或其他东西,但我怀疑所涉及的所有复杂性只会引入更多问题。
保持简单并重新运行搜索。
答案 1 :(得分:1)
在会话中缓存某些搜索结果是我强烈建议的。 Web应用程序应努力使最小的会话状态成为可能。使用一揽子逻辑来缓存用户会话状态的搜索结果(可能至少几kb),这实际上是在寻找内存问题。
相反,您应该有一个单独的搜索服务来管理自己的缓存。虽然这在策略中看起来类似于会话内的缓存,但它有几个优点:
上面的第三点解决了你的主要问题。
答案 2 :(得分:0)
为了查看是否有新项目,您可能需要重新运行搜索 - 即使只是为了计算。
您正在有效地缓存搜索结果。因此,正常答案是在一段时间后使结果到期(例如,结果仅有效1分钟),或者系统在数据更改时,缓存无效,导致搜索必须又跑了。
当用户返回时,是否可能有任何新结果?您只需在搜索结果页面上放置一个“刷新”按钮,即可再次运行搜索。
答案 3 :(得分:0)
您期望在数据库项目中提供什么样的刷新率?搜索结果是否会在短时间内发生剧烈变化,因为我不知道这种情况,但您可能会有不同的情况。
假设您有一个场景,您的数据库由一个或多个单独的线程填充,并且您有另一个独立的线程来搜索结果,请跟踪插入缓存中数据库的最新项目的时间戳。
现在,当用户想再次查看搜索结果时,比较时间戳,即将缓存时间戳与插入数据库的最后一项进行比较。如果没有匹配,则从缓存中重新查询else show。
如果您的方案确认我的假设是数据库没有得到太频繁的更新(例如,根据特定的搜索词或标准),那么这可以避免您经常查询数据库。