我们正在开发一个大型遗留应用程序,我们正在重新设计业务层和数据层。我们认为现在是重新设计缓存处理方式的好时机。是否有任何模式和最佳实践来实现缓存层(或在业务层中构建它)?
我能想到的唯一事情就是使用SQL Cache Dependency(这很难,因为我们有一个很大的遗留数据库,有很多表并不总是对应于业务对象)并且实现强类型化CacheManager类隐藏字符串键并消除类转换问题。
我们可以做些更复杂的事吗?有没有办法在执行更新/删除时强制执行缓存失效?我们应该以某种方式在缓存中维护单个对象并从DB中检索始终使用相同对象的ID列表吗?
基本上,您在ASP.NET中使用了哪些缓存技术?太糟糕了,我们不能使用支持缓存的IoC容器或ORM框架:(
编辑:我更关注可维护性而不是性能。
答案 0 :(得分:18)
public T GetFromCache<T>(string key, Func<T> ifKeyNotFoundDelegate)
之类的包装函数进行必须存储在缓存中的调用,以确保始终使用相同的缓存。 [1] 好吧,这涵盖了我们在网站上做的大部分内容(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;
}
确保
Ergo:他们犯错误的可能性较小。此外:您可以获得更好,更清晰的代码,例如:
List<MyEntity> list = new CacheManager(CacheGroups.Total).GetFromCache<List<MyEntity>>("function1result", ()=>DAO.Foo());
答案 1 :(得分:3)
这是一个很大的主题,但这里有一些建议:
如果有帮助,我会在我的书中详细介绍这个主题: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