Cookie与会话与数据库

时间:2017-03-02 16:05:12

标签: asp.net-mvc session cookies asp.net-mvc-5

我有一个网站,客户可以登录并购买特定范围内的产品(根据客户编号)。导航栏有产品类别的下拉列表,但没有显示任何没有产品的地方。

此时,在每个页面上查询数据库以填充产品类别菜单,但这样效率很低。我现在想知道“允许”产品列表是否应该在会话开始时存储在cookie或会话变量中。

根据我从其他问题中收集的内容,通常会使用会话变量,但是他们警告不要在会话变量中存储大量数据。在这种情况下,我会为每个用户存储一个可能很大的产品列表,那么cookie会更好吗?我不会将产品列表列为特别敏感,我会在下订单之前进行服务器端检查。或者我应该坚持每次查询数据库的当前解决方案吗?

要明确的是,我仍然会将信息存储在数据库中,这个问题只是询问临时存储,以便在整个会话期间快速访问。

我已经查看了以下问题,但我仍然觉得我没有得到我的特定情况的答案,并且关闭的问题没有提到过。

1 个答案:

答案 0 :(得分:3)

我采取的方法可能是这样的:

  • 将产品数据存储在所有客户之间共享的缓存中,并使用每个产品的主键作为每个产品的缓存密钥(的一部分)。使用的缓存策略可能会有所不同,具体取决于可伸缩性要求(System.Runtime.Caching vs redis vs file缓存)。一般情况下,我可能会使用滑动过期或LRU cache(请参阅this .NET example)获取产品数据,以便最受欢迎的产品可以比不受欢迎的产品更长时间地缓存。当针对特定主键发出请求时,首先检查缓存是否存在密钥,如果它返回null,则在返回产品之前从数据库中查找产品并填充缓存(请参阅this example)。
  • 对于每个客户,只存储主键和其他相关数据(他们可能获得的折扣级别等)。如果主键列表足够小,您可以使用cookie(encrypted)来实现此目的。如果您需要进行扩展以便为每个客户提供超过适合cookie的数量,那么请在数据库中查询主键。
  • 当客户请求数据时,首先获取主键列表,然后使用这些键访问预先缓存的产品数据以构建视图。您可以根据需要存储尽可能多的不同主键列表,而无需为每个客户或每个客户的每个用例从数据库中获取产品数据。

Think twice about using session state - 建议不要将会话状态用于用户个人资料数据。

当然,上述内容并未考虑可能需要的任何其他营销要求。因此,您可能需要根据需要调整此策略。例如,如果您需要更新产品信息的速度超过缓存通常会过期的速度,您可能会考虑首先更新数据库中的产品数据的方法,如果成功,则会在缓存上获取写锁定并更新缓存,太。这将允许近乎实时的缓存更新,而不必从数据库中使缓存无效并重新加载。