自动刷新缓存ASP.NET

时间:2017-03-01 16:15:27

标签: c# asp.net asp.net-mvc-4 caching browser-cache

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

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

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

由于

2 个答案:

答案 0 :(得分:3)

您可以使用TTL在第一次调用时将其缓存,让它无效,然后下一次调用将获取它并再次将其缓存回来。这样做的问题是,当你的线程不可用时,它会减慢你的线程,并且多个线程会等待它(假设你锁定了读取以防止泛滥)。

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

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

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

在下面的示例中,我的CachedRepository将在无效时刷新缓存的项目。其他线程将继续收到" old"值直到刷新完成。

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

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

答案 1 :(得分:0)

当密钥到期时,没有自动刷新缓存的机制。所有缓存系统都采用被动过期。密钥在到期后第一次被请求时无效,而不是在确切的到期时间自动。

你所谈论的本质上是一个永不过期的缓存,这很容易实现。简单地说就是没有过期(如果缓存机制允许)或者远期过期。然后,您唯一的问题是在某些计划中刷新缓存,这样它就不会变得陈旧。为此,一个选项是创建一个控制台应用程序,用于设置缓存中的值(重要的是,如果已经存在某些东西,则不关心),然后使用任务计划程序或类似程序来安排它以设定的间隔运行。另一种选择是使用Revalee之类的东西按照定义的时间间隔将回调安排到您的Web应用程序中。这与创建控制台应用程序基本相同,只有代码可以集成到您的同一网站项目中。

您还可以使用Hangfire直接在Web应用程序中执行调度,并可以使用它来运行控制台应用程序,点击URL等等。 Hangfire的强大之处在于它允许你几乎安排你想要的任何进程,但这也意味着你必须实际提供应该发生的代码,即实际连接HttpClient并获取URL,而不是仅仅告诉Revallee命中一个特定的URL。