[英]Store data in session, how and when to detect if data is stale
我有这种情况。
在#5,如果创建了一个新项目并符合用户的搜索条件,则它应成为结果的一部分。 但是由于在#5中,我只是从会话中检索,因此不会检测到它。
我的问题是,我应该额外进行检查吗? 如果是这样,如何在不进行实际检索的情况下有效地进行检查(这会违背目的)? 也许选择count(*)....并将其与会话中结果集的计数进行比较?
这取决于您的业务需求。 如果必须让用户获得最新的结果,则必须重新推定它们。
计数不会是100%,因为可能会有相应的删除。
您也许可以比较时间戳记或其他内容,但我怀疑所涉及的所有复杂性只会带来更多问题。
保持简单,然后重新运行搜索。
我强烈建议不要在会话中缓存某些搜索结果。 Web应用程序应努力使会话状态最小。 放入一揽子逻辑来针对用户会话状态缓存搜索结果(至少至少几个kb)实际上是在询问内存问题。
相反,您应该具有一个管理其自己的缓存的单例搜索服务。 尽管这在策略上看起来类似于在会话内部进行缓存,但是它具有几个优点:
上面的第三点解决了您的主要问题。
为了查看是否有新商品,您可能不得不重新运行搜索-甚至只是为了计数。
您正在有效地缓存搜索结果。 因此,正常答案是要么在设定的时间后使结果过期(例如,结果仅在1分钟内有效),要么使系统具有以下功能:在更改数据时,缓存无效,导致搜索必须再次运行。
到用户回到那里时,可能会有任何新结果吗? 您可以在搜索结果页面上放置一个“刷新”按钮,以使搜索再次运行。
您期望数据库项目中的刷新率是什么? 即使在很短的间隔内,搜索结果是否也会发生巨大变化,因为我不知道这种情况,但是情况可能会有所不同。
假设您有一个场景,其中数据库由一个或多个单独的线程填充,并且您有另一个独立的线程来搜索结果,请跟踪缓存中已插入数据库中的最新项的时间戳。
现在,当用户希望再次查看搜索结果时,将时间戳进行比较,即将缓存的时间戳与插入数据库的最后一项的时间戳进行比较。 如果没有匹配项,则重新查询,否则从您的缓存中显示。
如果您的情况证实了我的假设,即数据库的更新频率不是太高(写给特定的搜索词或条件),那么这可以避免您过于频繁地查询数据库。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.