Я использую MemoryCache для хранения таблицы данных, содержащей около 60 строк. Иногда я хочу «обновить» только часть таблицы. Таким образом, я получаю коллекции строк, которые я хочу, чтобы обновить на основе из идентификатора, как это:Если я обновляю кеш памяти, используя метод Set, с абсолютным истечением срока, будет ли это означать, что срок действия расширен?
var cachedDataSet = this.cache.Get(CacheKey) as DataSet;
var dataRows = cachedDataSet.Tables["MyTable"]
.AsEnumerable()
.Where(x => x.Field<int>("Id") == MyId)
.ToList<DataRow>();
я тогда сделать некоторые проверки против этого и основаны от результатов этого будет выбрать, чтобы получить данные из БД, удалите текущие строки из cachedDataSet и добавьте новые данные. Я пытаюсь сделать это следующим образом:
var refreshedData = GetMyData(Id);
foreach (var row in dataRows)
{
cachedDataSet.Tables["MyTable"].Rows.Remove(row);
}
foreach (var row in refreshedData.Tables["MyTable"].Rows)
{
cachedDataSet.Tables["MyTable"].Rows.Add(row.ItemArray);
}
Наконец, я добавляю cachedDataSet обратно в кэш с помощью Set
method:
var policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTimeOffset.Now.AddHours(12);
this.cache.Set(CacheKey, cachedDataSet, policy);
Итак, мой главный вопрос заключается в том, что если я извлечь кэш из в набор данных, изменить его, а затем использовать метод Set
с использованием новой CacheItemPolicy, будет ли это фактически сбросить абсолютное истечение? Я понимаю, что, используя метод set, он перезапишет существующий кешированный элемент новым, если он существует, и вставьте его, если он этого не сделает. Поэтому я предполагаю, что он перезапишет политику кэширования. Если да, существует ли способ не переписать абсолютное истечение при перезаписывании значений?
Это звучит как план. Как получить доступ к абсолютному истечению срока хранения кэшированного элемента? – sr28
Вы не можете сделать это (для этого нет API), поэтому я предлагаю хранить это время истечения вместе с самим предметом (как описано). – Evk
Не будет ли свойство ExpiresAt лучше, чем DateTimeOffset, поскольку свойство AbsoluteExpiration совпадает с этим? Насколько я понимаю, DateTimeOffset является моментом времени, поэтому его следует использовать в качестве контрольной точки для истечения срока действия. – sr28