我们有一个数据驱动的ASP.NET网站,该网站使用标准模式进行数据缓存(此处从MSDN改编):
public DataTable GetData()
{
string key = "DataTable";
object item = Cache[key] as DataTable;
if((item == null)
{
item = GetDataFromSQL();
Cache.Insert(key, item, null, DateTime.Now.AddSeconds(300), TimeSpan.Zero;
}
return (DataTable)item;
}
Run Code Online (Sandbox Code Playgroud)
这样做的问题是对GetDataFromSQL()的调用是昂贵的,并且该站点的使用相当高.因此,每隔五分钟,当缓存下降时,该站点变得非常"粘滞",而许多请求正在等待检索新数据.
我们真正想要发生的是旧数据保持最新,同时在后台定期重新加载新数据.(有人可能会因此看到的数据为六分钟之前的事实是不是一个大问题-数据不是那个时间敏感的).这是我自己可以写的东西,但知道是否有任何替代缓存引擎(我知道像Velocity,memcache这样的名称)支持这种情况会很有用.或者我错过了标准ASP.NET数据缓存的一些明显技巧?
您应该能够使用CacheItemUpdateCallback委托,它是第6个参数,它是Insert使用ASP.NET Cache 的第4个重载:
Cache.Insert(key, value, dependancy, absoluteExpiration,
slidingExpiration, onUpdateCallback);
Run Code Online (Sandbox Code Playgroud)
以下应该有效:
Cache.Insert(key, item, null, DateTime.Now.AddSeconds(300),
Cache.NoSlidingExpiration, itemUpdateCallback);
private void itemUpdateCallback(string key, CacheItemUpdateReason reason,
out object value, out CacheDependency dependency, out DateTime expiriation,
out TimeSpan slidingExpiration)
{
// do your SQL call here and store it in 'value'
expiriation = DateTime.Now.AddSeconds(300);
value = FunctionToGetYourData();
}
Run Code Online (Sandbox Code Playgroud)
来自MSDN:
当对象在缓存中到期时,ASP.NET会使用缓存项的键以及您可能希望更新该项的原因来调用CacheItemUpdateCallback方法.该方法的其余参数是out参数.您提供新的缓存项以及刷新缓存项时要使用的可选过期和依赖项值.
如果使用对Remove()的调用显式删除了缓存项,则不会调用更新回调.
如果要从缓存中删除缓存项,则必须在expensiveObject参数中返回null.否则,使用expensiveObject参数返回对新缓存数据的引用.如果未指定到期或依赖项值,则仅在需要内存时才会从缓存中删除该项目.
如果回调方法抛出异常,ASP.NET将禁止该异常并删除缓存的值.
我没有对此进行过测试,因此您可能需要稍微修改它,但它应该让您基本了解您要完成的任务.
| 归档时间: |
|
| 查看次数: |
1649 次 |
| 最近记录: |