MemoryCache 的大小设置是啥意思?

Posted

技术标签:

【中文标题】MemoryCache 的大小设置是啥意思?【英文标题】:What do the size settings for MemoryCache mean?MemoryCache 的大小设置是什么意思? 【发布时间】:2020-05-03 14:04:54 【问题描述】:

在控制器类中,我有

using Microsoft.Extensions.Caching.Memory;
private IMemoryCache _cache;
private readonly MemoryCacheEntryOptions CacheEntryOptions = new MemoryCacheEntryOptions()
    .SetSize(1)
    // Keep in cache for this time
    .SetAbsoluteExpiration(TimeSpan.FromSeconds(CacheExpiryInSeconds));

在 Startup.cs 中,我有

public class MyMemoryCache
    
        public MemoryCache Cache  get; set; 
        public MyMemoryCache()
        
            Cache = new MemoryCache(new MemoryCacheOptions
            
                SizeLimit = 1024,
            );
        
    

这些不同的尺寸设置是什么意思?

这是 .NET Core 2.1。

【问题讨论】:

Size 上的文档非常糟糕。期望它是字节似乎是合理的,因为它是 Int64 类型。 【参考方案1】:

我找到了一些有用的documentation。

SizeLimit 没有单位。如果设置了缓存大小限制,缓存条目必须以他们认为最合适的任何单位指定大小。缓存实例的所有用户都应该使用相同的单位系统。如果缓存条目大小的总和超过 SizeLimit 指定的值,则不会缓存条目。如果没有设置缓存大小限制,则在条目上设置的缓存大小将被忽略。

事实证明,SizeLimit 可以作为条目数量的限制,而不是这些条目的大小。

一个快速示例应用显示,SizeLimit 为 1,如下所示:

var options = new MemoryCacheEntryOptions().SetSize(1);
cache.Set("test1", "12345", options);
cache.Set("test2", "12345", options);

var test1 = (string)cache.Get("test1");
var test2 = (string)cache.Get("test2");

test2 将为空。

反过来,SetSize() 允许您准确控制条目的大小限制。例如,在以下示例中:

var cache = new MemoryCache(new MemoryCacheOptions

    SizeLimit = 3,
);

var options1 = new MemoryCacheEntryOptions().SetSize(1);
var options2 = new MemoryCacheEntryOptions().SetSize(2);
cache.Set("test1", "12345", options1);
cache.Set("test2", "12345", options2);

var test1 = (string)cache.Get("test1");
var test2 = (string)cache.Get("test2");

test1test2 都将存储在缓存中。但是如果SizeLimit设置为2,则只会成功存储第一个条目。

【讨论】:

所以SetSize 定义了每个条目占用多少个单元,SizeLimit 是缓存可能包含的这些单元的最大数量? @ThorkilVærge 没错。 SetSize 让您可以精细控制每个单元的大小。这将允许您拥有多个MemoryCacheEntryOptions,每个都有自己的大小。我用一个额外的例子更新了我的答案。 在第二个sn-p中,test2的大小为2是什么意思?更一般地说,为某些缓存条目指定大于 1 的大小的用例是什么? @OfirD,大小是您作为开发人员分配给您的条目的完全任意的度量。对于大多数用例,您总是将每个缓存对象视为与其他对象相同的大小,实际上,情况可能经常如此。但是,考虑一个实例,您缓存从您无法控制的 API 返回的有效负载,并且有效负载可能是高度可变的。在这种情况下,您可能希望在缓存之前检查字符长度/字节数组大小,并根据断点应用滑动大小。或者,您可以使用大小作为优先级,并且仅在有空间时才缓存。 还要注意那些通过 IDistributedCache 间接使用 MemoryCache 的人。文档不清楚 SizeLimit 的单位是什么,因为通用分布式缓存选项上没有等效的缓存条目选项:DistributedCacheEntryOptions。由于接口使用 byte[] 我假设单位是字节数,但没有找到说明这一点的文档。在证明我的假设的源代码中找到了这个:github.com/dotnet/runtime/blob/…

以上是关于MemoryCache 的大小设置是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

MemoryCache 不遵守配置中的内存限制

8-16位密码,数字、大小写字母组合、符号至少包含两种,是啥意思?

WORD文档里面10pt字和通栏排列是啥意思?怎么设置?

在CSS中position: relative是啥意思

MemoryCache获取/设置并分配给变量

C#中用于组件的背景图像布局的5个选项分别是啥意思?