2016-10-04 5 views
2

Я использую 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, он перезапишет существующий кешированный элемент новым, если он существует, и вставьте его, если он этого не сделает. Поэтому я предполагаю, что он перезапишет политику кэширования. Если да, существует ли способ не переписать абсолютное истечение при перезаписывании значений?

ответ

1

Да, он обновит срок действия. То, что вы можете сделать, - это время истечения срока хранения вместе с самим элементом, в кеше. Так

class CachedDataSet { 
    public DateTime ExpiresAt {get;set;} 
    public DataSet DataSet {get;set;} 
} 

Тогда при обновлении, вы сначала получить этот элемент из кэша и использовать его ExpiresAt как новое значение AbsoluteExpiration.

+0

Это звучит как план. Как получить доступ к абсолютному истечению срока хранения кэшированного элемента? – sr28

+0

Вы не можете сделать это (для этого нет API), поэтому я предлагаю хранить это время истечения вместе с самим предметом (как описано). – Evk

+0

Не будет ли свойство ExpiresAt лучше, чем DateTimeOffset, поскольку свойство AbsoluteExpiration совпадает с этим? Насколько я понимаю, DateTimeOffset является моментом времени, поэтому его следует использовать в качестве контрольной точки для истечения срока действия. – sr28