Истечение кэшированного элемента через CacheItemPolicy в .NET MemoryCache
Я запутался в свойстве AbsoluteExpiration на CacheItemPolicy.
Документация MSDN для него говорит: "Период времени, который должен пройти до того, как будет выведена запись в кэш". Он использует System.DateTimeOffset для определения "периода времени".
Но если вы посмотрите документацию DateTimeOffset MSDN, в нем говорится, что она представляет собой момент времени... относительно скоординированного универсального времени (УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ). "Ссылка также на этот qaru.site/info/237814/....
Вы видите проблему? AbsoluteExpiration ожидает "период времени" (например, 5 секунд или 2 часа), но для этого требуется объект, который представляет собой "момент времени" (например, 21 декабря 2012 г., 06:14:00 EST).
В приведенном ниже коде я определяю единую политику для всех элементов. Я хочу, чтобы каждый элемент истекал cacheExpiryInSeconds
секунд после их добавления. Может ли кто-то проверить, что я делаю это правильно?
public class MyCache : IRoutingInfoCache
{
MemoryCache _routingInfoCache;
CacheItemPolicy _cachePolicy;
public MyCache(int cacheExpiryInSeconds)
{
_routingInfoCache = new MemoryCache("myCache");
_cachePolicy = new CacheItemPolicy() {
AbsoluteExpiration =
new DateTimeOffset(
DateTime.UtcNow.AddSeconds(cacheExpiryInSeconds))
};
}
public void Put(string key, object cacheItem)
{
// based on how I constructed _cachePolicy, will this item expire
// in cacheExpiryInSeconds seconds?
_routingInfoCache.Add(new CacheItem(key, cacheItem), _cachePolicy);
}
}
Ответы
Ответ 1
Кэширование придерживается времени UTC, чтобы предлагать единые расчеты времени, поэтому вы указываете точку времени, в которой истекает срок хранения кэшированной записи, в UTC, и кеш будет вычислять соответствующее различие с этого момента и истекает, как ожидалось.
Ваш код не будет работать так, как ожидалось, так как ваше абсолютное истечение будет до, когда ваш элемент кэша будет введен один раз cacheExpiryInSeconds
секунд, в результате выселения немедленного. Вы не можете использовать экземпляр CacheItemPolicy, когда AbsoluteExpiration установлен в ближайшем будущем, и это раздражает.:)