Кэш в памяти GetOrCreate с MemoryCacheEntryOptions - PullRequest
0 голосов
/ 09 мая 2018

В текущей реализации IMemoryCache интерфейс имеет следующие методы:

bool TryGetValue(object key, out object value);
ICacheEntry CreateEntry(object key);
void Remove(object key);

У нас есть возможность запросить кэш для записи следующим образом:

//first way
if (string.IsNullOrEmpty
(cache.Get<string>("timestamp")))
{
  cache.Set<string>("timestamp", DateTime.Now.ToString());
}

//second way
if (!cache.TryGetValue<string>
("timestamp", out string timestamp))
{
    //
    cache.Set<string>("timestamp", DateTime.Now.ToString());
}

Но есть другой метод, который должен делать то, что должен делать кеш (GetOrCreate) с заводским параметром:

public static TItem GetOrCreate<TItem>(this IMemoryCache cache, object key, Func<ICacheEntry, TItem> factory)
{
   object obj;
   if (!cache.TryGetValue(key, out obj))
   {
     ICacheEntry entry = cache.CreateEntry(key);
     obj = (object) factory(entry);
     entry.SetValue(obj);
     entry.Dispose();
   }
   return (TItem) obj;
}

Как вы можете видеть выше, метод Set принимает MemoryCacheEntryOptions или любые даты absoluteExpirationRelativeToNow, absoluteExpiration и т. Д. (https://github.com/aspnet/Caching/blob/12f998d69703fb0f62b5cb1c123b76d63e0d04f0/src/Microsoft.Extensions.Caching.Abstractions/MemoryCacheExtensions.cs),, но метод GetOrCreate не поддерживает этот тип ' per-entry-expiration-date ', когда мы создаем новую запись.

Я пытаюсь выяснить, упускаю ли я что-то или мне нужно сделать PR, чтобы добавить эти методы.

Приложение:

public static ICacheEntry SetValue(this ICacheEntry entry, object value)
{
   entry.Value = value;
   return entry;
 }

Открыл здесь вопрос: https://github.com/aspnet/Caching/issues/392, чтобы получить больше отзывов.

1 Ответ

0 голосов
/ 09 мая 2018

Я не уверен, правильно ли я понял, но вы можете установить все параметры 'per-entry-expiration-date' для записи, которую вы получаете, в качестве параметра для вашей фабрики:

string timestamp = cache.GetOrCreate("timestamp", entry =>
{
    entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(5);

    return DateTime.Now.ToString();
});

string timestamp = cache.GetOrCreate("timestamp", entry =>
{
    entry.SlidingExpiration = TimeSpan.FromSeconds(5);

    return DateTime.Now.ToString();
});

Все MemoryCacheEntryOptions доступны на ICacheEntry.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...