C# 跨会话的内存缓存
我有一个web应用程序,它使用一个带有控制器过滤器的.net API,每次都可以获取令牌并从数据库中抓取用户。我试图消除相同的数据库调用,所以我使用了MemoryCacheC# 跨会话的内存缓存,c#,asp.net,.net,entity-framework,caching,C#,Asp.net,.net,Entity Framework,Caching,我有一个web应用程序,它使用一个带有控制器过滤器的.net API,每次都可以获取令牌并从数据库中抓取用户。我试图消除相同的数据库调用,所以我使用了MemoryCache public ObjectCache cache = MemoryCache.Default; // setting it, and only calling database again if cache is empty cache.Set("cachedUser", userFromDB, policy);
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。您的缓存密钥是“cachedUser”
。由于密钥对于每个用户都不是唯一的,因此将检索相同的结果
一次修复是缓存在一个唯一的字段上,比如UserId。类似于-
cache.Set(userFromDB.Id、userFromDB、policy)代码>
这是假设每个用户都有一个唯一的Id
有趣的,也许按会话Id键入可能会有帮助?我想到了,但我可能有数千个用户。所以我假设数千个缓存密钥太多了。MemoryCache存在于服务器上,存储在内存中。如果将某个内容放入MemoryCache,它将一直保留到过期或服务器重新启动,或者您手动将其删除。@JohanP那么使用“user”这样的键缓存数据库用户将在多个会话中保持不变?您是否建议使用不同的密钥缓存每个用户?@brett还请记住,MemoryCache只适用于一台服务器。如果你的应用在服务器场或多个容器中运行,它们将不会在多个容器中持续运行。谢谢,这正是我不确定的。