当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《ASP.NET中缓存的模式和最佳实践是什么?》经验,为你挑选了1个好方法。

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

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

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

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

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



1> Jan Jongboom..:

只需将每个查询结果保存到数据库中(使用缓存键:您的查询,值:您的业务对象列表)

使用分布式缓存,如ASP.Net缓存旁边的memcached

使用像https://github.com/enyim/memcached-providers这样复杂的缓存管理器; 可以有缓存组.有些数据需要存储很长时间,有些时间很短.一些数据必须存储在ASP.Net缓存等中.

是否必须使用包装函数将调用存储在缓存中,public T GetFromCache(string key, Func 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)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:他们犯错误的可能性较小.此外:您获得更好,更清晰的代码,例如:

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

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有