我们正在开发一个大型遗留应用程序,我们正在重新设计业务层和数据层.我们认为现在是重新设计缓存处理方式的好时机.是否有任何模式和最佳实践来实现缓存层(或在业务层中构建它)?
我能想到的唯一事情就是使用SQL Cache Dependency(这很难,因为我们有一个很大的遗留数据库,有很多表并不总是对应于业务对象)并且实现了强类型的CacheManager类隐藏字符串键并消除类转换问题.
我们可以做些什么更复杂的事情吗?有没有办法在执行更新/删除时强制执行缓存失效?我们应该以某种方式在缓存中维护单个对象并从DB中检索始终使用相同对象的ID列表吗?
基本上你在ASP.NET中使用什么缓存技术?太糟糕了,我们不能使用支持缓存的IoC容器或ORM框架:(
编辑:我更关注可维护性而不是性能.
Jan*_*oom 19
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;
Run Code Online (Sandbox Code Playgroud)
通过使用不同的界面,您可以确保用户不会在这里犯错误.
喜欢
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;
}
Run Code Online (Sandbox Code Playgroud)
这确保了
Ergo:他们犯错误的可能性较小.此外:您获得更好,更清晰的代码,例如:
List<MyEntity> list = new CacheManager(CacheGroups.Total).GetFromCache<List<MyEntity>>("function1result", ()=>DAO.Foo());
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9693 次 |
最近记录: |