我们正在开发一个大型遗留应用程序,我们正在重新设计业务层和数据层.我们认为现在是重新设计缓存处理方式的好时机.是否有任何模式和最佳实践来实现缓存层(或在业务层中构建它)?
我能想到的唯一事情就是使用SQL Cache Dependency(这很难,因为我们有一个很大的遗留数据库,有很多表并不总是对应于业务对象)并且实现了强类型的CacheManager类隐藏字符串键并消除类转换问题.
我们可以做些什么更复杂的事情吗?有没有办法在执行更新/删除时强制执行缓存失效?我们应该以某种方式在缓存中维护单个对象并从DB中检索始终使用相同对象的ID列表吗?
基本上你在ASP.NET中使用什么缓存技术?太糟糕了,我们不能使用支持缓存的IoC容器或ORM框架:(
编辑:我更关注可维护性而不是性能.
只需将每个查询结果保存到数据库中(使用缓存键:您的查询,值:您的业务对象列表)
使用分布式缓存,如ASP.Net缓存旁边的memcached
使用像https://github.com/enyim/memcached-providers这样复杂的缓存管理器; 可以有缓存组.有些数据需要存储很长时间,有些时间很短.一些数据必须存储在ASP.Net缓存等中.
是否必须使用包装函数将调用存储在缓存中,public T GetFromCache
以确保始终使用缓存.[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)obj;
通过使用不同的界面,您可以确保用户不会在这里犯错误.
喜欢
public T GetFromCache(string key, Func ifnotfound) { T obj = this.GetFromCache(key) as T; if(obj == default(T)) { obj = ifnotfound.Invoke(); this.StoreInCache(key, obj); } return obj; }
这确保了
我们总是使用正确的类型
您的用户始终以相同的方式使用缓存
Ergo:他们犯错误的可能性较小.此外:您获得更好,更清晰的代码,例如:
Listlist = new CacheManager(CacheGroups.Total).GetFromCache >("function1result", ()=>DAO.Foo());