C# · 12月 23, 2021

c# – 大型asp.net缓存存储的持久性方法的效率

好奇,如果有人对哪种方法更适合asp.net缓存有意见.选项一,缓存中较少的项目较复杂,或许多项目较不复杂.

为了便于讨论,我们假设我的网站有SalesPerson和Customer对象.这些是非常简单的类,但我不想对数据库很讨厌,所以我想懒得将它们加载到缓存中,并在我做出更改时将它们从缓存中失效 – 这很简单.

选项1
创建字典并缓存整个字典.当我需要从缓存中加载SalesPerson的一个实例时,我得到了Dictionary并对Dictionary进行了正常的键查找.

选项2
在每个项目的键前加上它并将其直接存储在asp.net缓存中.例如,缓存中的每个SalesPerson实例都将使用前缀加上该对象的键的组合,因此它可能看起来像sp_ [guid]并存储在asp.net缓存中,而且还存储在缓存中的Customer对象中.像cust_ [guid]这样的关键.

我对选项二的恐惧之一是条目数量会变得非常大,在SalesPerson,Customer和十几个其他类别之间我可能在缓存中有25K项目和高度重复查找类似于我正在使用的字符串资源在几个地方可能会支付罚款,而代码通过缓存的密钥集合查找它在其他25K之间找到它.

我确信在某些时候,在缓存中存储太多项目的回报正在减少,但我对这些问题的意见感到好奇.

解决方法 最好在缓存中创建许多较小的项目,而不是创建更少,更大的项目.这是推理:

1)如果您的数据很小,那么缓存中的项目数量将相对较少,并且不会产生任何差异.从缓存中获取单个实体比获取字典然后从该字典中提取项目更容易.

2)一旦数据变大,缓存可用于以智能方式管理数据. HttpRuntime.Cache对象使用最近最少使用(LRU)算法来确定缓存中的哪些项目将过期.如果缓存中只有少量高度使用的项目,则此算法将无用.但是,如果缓存中有许多较小的项目,但其中90%在任何给定时刻都没有使用(非常常见的使用启发式),那么LRU算法可以确保那些看到活动使用的项目保留在缓存中在逐出较少使用的物品的同时,确保使用过的物品有足够的空间.

随着应用程序的增长,能够管理缓存中的内容的重要性将是最重要的.此外,我还没有看到在缓存中拥有数百万个密钥会导致性能下降 – 哈希表非常快,如果您发现问题,可以通过更改缓存密钥的命名约定来轻松解决,以便优化它们以用作缓存密钥.哈希表键.