自动刷新缓存 ASP.NET

Mos*_*ael 2 c# asp.net caching browser-cache asp.net-mvc-4

我有一个网站,里面有很多数据。我使用 C# .NET MVC4 进行开发。当缓存为空时,我有一个很大的页面加载缓慢问题。目前我使用的缓存包含我需要的所有数据,当缓存在页面上时会立即加载,但是当缓存过期时,页面需要大约 10 秒才能完全加载。

我正在寻找一个在缓存过期时自动刷新缓存的选项,我一直在搜索谷歌,但在这件事上找不到任何东西

应该怎么做?或者有其他选择来解决这个问题吗?

谢谢

小智 5

您可以在第一次调用时使用 TTL 缓存它,让它失效,然后下一次调用将获取它并再次缓存它。这样做的问题是你的线程变慢了,而它必须去获取数据,因为它不可用,并且多个线程将等待它(假设你锁定读取以防止泛滥)。

解决第一个加载问题的一种方法是在应用程序启动时准备缓存。这确保当您的应用程序准备好使用时,数据已经加载并且速度很快。创建一个像 ICachePrimer { void Prime() } 这样的快速接口,扫描你的程序集,解析它们,然后运行它们。

我喜欢在失效问题上绕过空缓存的方法是在删除数据之前刷新数据。要在 .Net 中轻松完成此操作,您可以利用 MemoryCache 的 CacheItemPolicy 回调。

UpdateCallback 在删除项目之前发生,并允许您刷新项目。
RemovedCallback 在项目被移除后发生。

在下面的示例中,我的 CachedRepository 将在缓存项失效时刷新它。其他线程将继续接收“旧”值,直到刷新完成。

public class MyCachedRepository : IMyRepository
{
    private readonly IMyRepository _baseRepository;
    private readonly ObjectCache _cache;

    public MyCachedRepository(IMyRepository baseRepository, ObjectCache cache)
    {
        _baseRepository = baseRepository;
        _cache = cache;
    }

    public string GetById(string id)
    {
        var value = _cache.Get(id) as string;

        if (value == null)
        {
            value = _baseRepository.GetById(id);
            if (value != null)
                _cache.Set(id, value, GetPolicy());
        }

        return value;
    }

    private CacheItemPolicy GetPolicy()
    {
        return new CacheItemPolicy
        {
            UpdateCallback = CacheItemRemoved,
            SlidingExpiration = TimeSpan.FromMinutes(0.1),  //set your refresh interval
        };
    }

    private void CacheItemRemoved(CacheEntryUpdateArguments args)
    {
        if (args.RemovedReason == CacheEntryRemovedReason.Expired || args.RemovedReason == CacheEntryRemovedReason.Removed)
        {
            var id = args.Key;
            var updatedEntity = _baseRepository.GetById(id);
            args.UpdatedCacheItem = new CacheItem(id, updatedEntity);
            args.UpdatedCacheItemPolicy = GetPolicy();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

来源:http : //pdalinis.blogspot.in/2013/06/auto-refresh-caching-for-net-using.html