【问题标题】:MemoryCache across sessions跨会话的 MemoryCache
【发布时间】:2020-05-21 22:52:29
【问题描述】:

我有一个使用 .net API 和控制器过滤器的 Web 应用程序,它每次都获取令牌并从数据库中抓取用户。我试图消除相同的数据库调用,所以我使用了 MemoryCache。

 public ObjectCache cache = MemoryCache.Default;

 // setting it, and only calling database again if cache is empty
 cache.Set("cachedUser", userFromDB, policy);

我的问题是我打开另一个浏览器并以其他用户身份登录,我可以看到第一个用户仍在调试器中缓存。是调试器范围导致这种情况发生,还是他们自己的浏览器会话中的多个用户每个都有自己的缓存对象?我不确定用户 A 是否会保持在本地缓存而用户 B 会保持在本地缓存,或者用户 A 会保持缓存而用户 B 会被误认为是用户 A。

【问题讨论】:

  • 有趣,也许通过会话 ID 键入可能会有所帮助?
  • 我想到了,但我可能有成千上万的用户。所以我会假设成千上万的缓存键太多了。
  • MemoryCache 存在于服务器上,它存储在内存中。如果你在 MemoryCache 中放了一些东西,它会一直留在那里直到它过期或服务器重新启动,或者你手动删除它。
  • @JohanP 那么用“user”之类的键缓存数据库用户会在多个会话中持续存在吗?您是否建议使用不同的密钥缓存每个用户?
  • @brett 另请记住,MemoryCache 用于一台服务器。如果您的应用在服务器场或多个容器中运行,它们将不会持续存在。

标签: c# asp.net .net entity-framework caching


【解决方案1】:

您的缓存键是"cachedUser"。由于每个用户的密钥不是唯一的,因此将检索到相同的结果。

一旦解决方法是缓存在唯一字段(例如 UserId)上。类似于 -

cache.Set(userFromDB.Id, userFromDB, policy);

这是假设每个用户都有一个唯一的Id

【讨论】:

  • 谢谢,这正是我不确定的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
  • 2013-05-16
  • 2014-08-13
  • 2014-09-25
  • 2014-05-10
  • 2011-01-01
相关资源
最近更新 更多