【问题标题】:how to cancel expiration of cached item如何取消缓存项的过期
【发布时间】:2015-03-06 12:19:07
【问题描述】:

我在 MemoryCache 中添加了一个缓存项,该缓存项每 10 分钟过期一次。但是当它过期时,我正在调用一种从数据库中获取新数据并再次使用相同键在 MemoryCache 中设置新缓存项的方法。但是,如果在 Cache item removed 回调方法中引发异常,则 item 将从 MemoryCache 中删除,但不会将新项目添加到缓存中。此缓存项用于进一步的操作。 这种情况如何处理?

【问题讨论】:

标签: c# caching memorycache


【解决方案1】:

不要让缓存数据在过期时自动刷新,而是使用 GetData 方法调用 GetFromDataBase 并在缓存没有返回任何内容时调用它。这样异常就会被传递回调用代码,并且下一次调用将(希望)重新填充缓存

ie(请原谅伪代码)

    public class data
    {
        public SomeData GetData(int id)
        {
            if (cache.Contains(id))
            {
                return cache[id];
            }
            else
            {
                SomeData data = GetDataFromDB(id);
                cache[id] = data;
                return data;
            }
        }
    }

【讨论】:

  • 或者您也可以采用这种方法并自动刷新。这样,您可以避免在大多数情况下访问和过期项目时的性能损失。
  • 我可以停止缓存项的过期吗?
  • 缓存过期策略由您决定。此代码只是在没有缓存时创建一个回退。从而防止您在 yoir 问题中提出的错误。 @juan 在我看来,与缓存过期相关的自动刷新是危险的。但是是的,定期填充缓存的单独线程可能会很好。您还可以添加更多代码以尝试确保在大容量多线程场景中不会多次命中数据库
  • 我尝试在 CacheEntryUpdateCallback 方法中更新旧的缓存项,但更新回调后新添加的项也会自动删除。
  • @Ewan,当前的实现与您所说的完全相同。单独的线程定期填充数据并将其设置在缓存中。以前缓存在 CacheEntryRemovedCallback 中更新。 RemovedCallback 的问题是,它是在删除 cachedItem 之后调用的,所以我们没有它的旧副本,以防在设置新缓存项时出现任何问题。
猜你喜欢
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2010-11-28
  • 2014-11-14
  • 1970-01-01
相关资源
最近更新 更多