如果我使用Set方法更新内存缓存,绝对到期,这是否意味着延长了到期时间?

时间:2016-10-04 11:23:33

标签: c# caching memorycache

我正在使用MemoryCache来存储一个包含大约60行的数据表。有时我只想“刷新”表格的一部分。所以我根据这样的id得到了我想要刷新的行集合:

var cachedDataSet = this.cache.Get(CacheKey) as DataSet;

var dataRows = cachedDataSet.Tables["MyTable"]
                            .AsEnumerable()
                            .Where(x => x.Field<int>("Id") == MyId)
                            .ToList<DataRow>();

然后我对此进行一些检查,并根据结果选择从DB获取数据,从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);
}

最后,我使用Set method

将cachedDataSet添加回缓存
var policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTimeOffset.Now.AddHours(12);
this.cache.Set(CacheKey, cachedDataSet, policy);

所以,我的主要问题是,如果我将缓存提取到数据集中,修改它然后使用新的CacheItemPolicy使用Set方法,这会有效地重置绝对到期吗?我的理解是,通过使用set方法,这将使用new覆盖现有的缓存项(如果存在),如果不存在则插入它。所以,我的猜测是它会覆盖缓存策略。如果是这样,有没有办法在覆盖值时不覆盖绝对过期?

1 个答案:

答案 0 :(得分:1)

是的,它会更新到期时间。您可以做的是将过期时间与项本身一起存储在缓存中。所以

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

然后在刷新时,您首先从缓存中获取此项,并使用ExpiresAt作为新的AbsoluteExpiration值。