首页 > 解决方案 > 在 ASP.NET Web API 中缓存单个键与缓存键字典

问题描述

我需要在 ASP.NET Web API 中缓存有关用户角色的信息。我决定使用System.Web.Helpers.WebCache类。角色是纯字符串,大约 40 个字符长。每个用户可能有 1-10 个角色。

我正在考虑两种方法来做到这一点:

  1. 使用WebCache.Set(UserID, List<String>).使用用户 ID 作为键并将角色列表(字符串)存储为值。它很容易检索。
  2. 使用字典,我将使用 userId 作为键,使用角色列表作为值,然后缓存字典。这样我只用一个键进行缓存。当我检索此信息时,我首先检索字典,然后使用用户 ID 获取角色信息。

问题:

  1. 哪种方法更好?我喜欢方法一,因为它易于使用。它有什么缺点吗?
  2. 我计算用于将这些键保存到缓存中的内存使用的方法是将相同数量的数据(存储 10 个字符串类型的角色)添加到记事本中,然后计算记事本的大小(使用 UTF-8 编码)。大小约为500 bytes,磁盘大小为4 KB. 然后如果我有 200 个用户,我将乘以 200 * 500 字节来计算内存使用量。这是正确的(如果近似关闭,我可以)计算方式吗?

标签: c#.netcachingasp.net-web-apimemory-consumption

解决方案


1. 方案一是可取的。它很简单,似乎只提供优势。

2.您的计算对选项1有意义,但对选项2没有意义。使用散列的AC#字典占用更多内存,对于像这样的原始数据和短数据,散列所占用的数据可能会显着增加。

与可维护性和功能相比,此类应用程序的单个字节的内存存储通常是次要问题,这是因为用户角色通常是具有相当大安全问题的核心功能,并且随着项目的发展,将变得非常重要的是代码是可维护和安全的。

缓存应该专门用作一种优化,因为这与相对较小的用户群(约 200 人)的少量数据有关,最好使这些角色的缓存细化且易于重新获取。根据这个库的官方文档

Microsoft system.web.helpers.webcache

通常,您永远不应指望已缓存的项目在缓存中

因为我假设用户角色定义了一些相当重要的功能,所以最好将这些角色的查询添加到您的 Web API 请求中,而不是在本地存储它们。

但是,如果您一心想要使用此缓存并在它消失时重新获取,那么根据您的问题,选项一将是一个更可取的选择。

这是因为列表占用的内存更少,在这种情况下看起来更直接,我认为使用字典没有任何好处。

当您拥有大型数据集并需要速度时,字典会大放异彩,但对于所有数据都已存储在内存中且数据集相对较小的场景,字典会带来复杂性和更高的内存要求,而其他方面则不多。尽管在大多数现代设备和服务器上的任何一种情况下,内存使用量听起来都可以忽略不计。

鉴于您需要按用户查找角色,字典可能听起来很有吸引力,但 WebCache 类似乎已经提供了这种功能,因此额外的字典失去了吸引力


推荐阅读