ASP.NET中缓存的模式和最佳实践是什么?

时间:2009-11-19 14:33:13

标签: asp.net caching

我们正在开发一个大型遗留应用程序,我们正在重新设计业务层和数据层。我们认为现在是重新设计缓存处理方式的好时机。是否有任何模式和最佳实践来实现缓存层(或在业务层中构建它)?

我能想到的唯一事情就是使用SQL Cache Dependency(这很难,因为我们有一个很大的遗留数据库,有很多表并不总是对应于业务对象)并且实现强类型化CacheManager类隐藏字符串键并消除类转换问题。

我们可以做些更复杂的事吗?有没有办法在执行更新/删除时强制执行缓存失效?我们应该以某种方式在缓存中维护单个对象并从DB中检索始终使用相同对象的ID列表吗?

基本上,您在ASP.NET中使用了哪些缓存技术?太糟糕了,我们不能使用支持缓存的IoC容器或ORM框架:(

编辑:我更关注可维护性而不是性能。

3 个答案:

答案 0 :(得分:18)

  • 只需将每个查询结果保存到数据库中(使用缓存键:您的查询,值:您的业务对象列表)
  • 使用分布式缓存,例如ASP.Net缓存旁边的memcached
  • 使用像https://github.com/enyim/memcached-providers这样复杂的缓存管理器;可以有缓存组。有些数据需要存储很长时间,有些时间很短。有些数据必须存储在ASP.Net缓存等
  • 使用包含public T GetFromCache<T>(string key, Func<T> ifKeyNotFoundDelegate)之类的包装函数进行必须存储在缓存中的调用,以确保始终使用相同的缓存。 [1]
  • 想一想何时使用ASP.Net缓存,以及何时使用分布式缓存。每次请求读取的数据都应存储在ASP.Net中,搜索结果等大数据;有很多不同的键和数据等应该在memcached中。
  • 添加版本控制。使用版本号前缀所有密钥,这样您在更新Web应用程序时就不会遇到麻烦,并且某些对象会更改。

好吧,这涵盖了我们在网站上做的大部分内容(20个内存分布在20台服务器上)。

[1]通过使这样的函数成为缓存中存储内容的唯一接口,您可以实现以下功能。假设我想使用缓存中的某些东西,比如函数的结果。通常你会做类似

的事情
CacheManager cm = new CacheManager(CacheGroups.Totals);
object obj = cm.GetFromCache("function1result");
if(obj == null)
{
    obj = (object)DAO.Foo();
    cm.StoreInCache("function1result", obj);
}
return (List<MyEntity>)obj;

通过使用不同的界面,您可以确保用户不会在此处犯错。

public T GetFromCache<T>(string key, Func<T> ifnotfound)
{
    T obj = this.GetFromCache(key) as T;
    if(obj == default(T)) 
    { 
         obj = ifnotfound.Invoke();
         this.StoreInCache(key, obj);
    }
    return obj;
}

确保

  1. 我们始终使用正确的类型
  2. 您的用户始终以相同的方式使用缓存
  3. Ergo:他们犯错误的可能性较小。此外:您可以获得更好,更清晰的代码,例如:

    List<MyEntity> list = new CacheManager(CacheGroups.Total).GetFromCache<List<MyEntity>>("function1result", ()=>DAO.Foo());
    

答案 1 :(得分:3)

这是一个很大的主题,但这里有一些建议:

  1. 不要缓存不太可能被重用的数据,例如用户特定数据
  2. 所有层的缓存:客户端,Silverlight(隔离存储),代理,http.sys,IIS,ASP.NET缓存对象,ASP.NET每请求缓存,SQL Server
  3. 尽可能使用SqlDependency / SqlCacheDependency但不要过度使用
  4. 避免会话状态;
  5. 时使用cookies代替
  6. 利用页面和控件(片段)输出缓存
  7. 考虑在需要时使用缓存验证
  8. 考虑ASP.NET缓存对象的轻量级替代品,例如弱内存引用
  9. 如果使用正确,SQL Server可以充当大缓存
  10. 如果有帮助,我会在我的书中详细介绍这个主题:Ultra-Fast ASP.NET

答案 2 :(得分:1)

MS模式和实践团队创建了Enterprise Library,作为对这个问题的回应,用于一系列普通方案。 EntLib包括缓存以及数据访问,验证,日志记录,异常处理等。我们已经使用了多年,如果没有它,就不会考虑启动新项目。

http://www.codeplex.com/entlib

与P&amp; P主页一样,http://msdn.microsoft.com/en-us/practices/default.aspx