【问题标题】:ASP.NET MVC - How to correctly 'cache' users ID's?ASP.NET MVC - 如何正确“缓存”用户 ID?
【发布时间】:2016-03-20 12:13:57
【问题描述】:

我有一个调用 WebApi 的 MVC4 Web 应用程序。 WebApi 返回一个 JSON 对象列表,然后将其转换为适当的 Model 并传递给 View

目前,我正在“缓存”这个对象列表,然后将其传递给 Session 变量中的 View,然后可以通过分页进行分页。

我知道这很糟糕。我的想法是将 JSON 列表存储在数据库中。

我需要做的是确定将数据库中的 JSON 项目列表与请求它的用户相关联的最佳方法。每次用户第一次访问应用程序的 Controller 然后存储 ID(基于 GUID)时,我都在考虑创建一个 Session 变量,然后可以针对数据库进行查询。

同样,上述想法需要使用Session,这很糟糕。我可以用什么代替?

请注意,我没有登录系统,因此没有“用户”表,因此必须即时分配 ID。

【问题讨论】:

  • 每个会话都有一个会话 ID...

标签: asp.net asp.net-mvc asp.net-mvc-4 session


【解决方案1】:

您保留在会话中的数据将可用于当前会话的任何请求,直到会话到期。

会话并不总是坏的。有一些有效的用例,您可以在会话中存储一些数据,前提是您不使用 In-Memory 会话。 使用 In-Memory 会话不好。您应该使用一个小型数据库表来存储您希望在会话中保留的数据(例如:购物车数据等。)或者如果您真的想要会话(为什么?),您应该使用 StateServer 或SqlServer 会话模式

如果您不希望保留应用的本地数据库来存储此信息,您也可以考虑将其保留在缓存层而不是会话中。您可以使用 dot net 中的 MemoryCache 类。

将数据设置到缓存的快速示例。

ObjectCache cache = MemoryCache.Default;
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now.AddDays(1);

var products = new List<string> { "iPhone","MacBookPro","Beer"};
var userId=25;
var cacheKey="productsOf"+userId;

cache.Set(cacheKey, products, policy);

并从缓存中读取,

var userId=25;
var cacheKey="productsOf"+userId;
var test= cache.Get(cacheKey);

Get 方法返回一个对象,您需要将其显式转换为您的自定义类/数据结构。您可以将任何对象保留在缓存中。根据您的具体要求更新缓存的到期日期。 MemoryCache 类在 System.Runtime.Caching 命名空间中可用。

类似于内存中的会话,缓存会定期自动清除。所以我猜你最好的选择是使用一个小的本地数据库表。

【讨论】:

  • 非常感谢您的回复。我当前存储在 Session 中的对象可能有 100 多个对象的列表。我没有看到任何性能问题,它使我能够实现所需的快速分页。您认为 Session 中包含 100 多个对象的列表好吗?
  • 取决于您在这些对象中的内容以及它们的轻/重。记住会话存储在服务器中,你不应该超载它。缓存或持久化所需的最少信息。
猜你喜欢
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2010-09-07
  • 2010-10-26
相关资源
最近更新 更多