MemoryCache的大小设置是什么意思?

时间:2020-01-16 17:02:09

标签: c# caching asp.net-core-2.1 memorycache

在控制器类中,我有

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。

1 个答案:

答案 0 :(得分:11)

我能够找到一些有用的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,则只有第一个条目将被成功存储。