Что означают настройки размера для MemoryCache? - PullRequest
1 голос
/ 16 января 2020

В классе контроллера у меня есть

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 Ответ

3 голосов
/ 16 января 2020

Мне удалось выследить некоторую полезную документацию .

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, будет успешно сохранена только первая запись.

...