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");
test1
和 test2
都将存储在缓存中。但是如果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 的大小设置是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章