【问题标题】:If I update memory cache using the Set method, with an absolute expiry, will this mean the expiry is extended?如果我使用 Set 方法更新内存缓存,并且绝对到期,这是否意味着到期延长?
【发布时间】:2016-10-04 11:23:33
【问题描述】:

我正在使用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>();

然后我对此进行一些检查,并根据结果选择从数据库中获取数据,从缓存数据集中删除当前行并添加新数据。我尝试这样做:

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);

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

【问题讨论】:

    标签: c# caching memorycache


    【解决方案1】:

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

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

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

    【讨论】:

    • 这听起来像是一个计划。如何访问缓存项的绝对到期时间?
    • 你不能这样做(没有 API),这就是为什么我建议将过期时间与项目本身一起存储(如所述)。
    • ExpiresAt 属性作为 DateTimeOffset 是否会更好,因为 AbsoluteExpiration 属性与此相同?据我了解,DateTimeOffset 是一个时间点,因此应该可以用作到期的参考点。
    • 可以是DateTimeOffset(虽然DateTime和DateTimeOffset都代表时间点,只是DateTimeOffset还包含时区信息)。
    猜你喜欢
    • 2016-07-14
    • 2014-12-07
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多