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
| 归档时间: |
|
| 查看次数: |
6490 次 |
| 最近记录: |