Pet Shop 4.0的缓存机制

原创 2006年06月04日 22:53:00
http://www.ms2.cn/blogs/compass/archive/2006/05/18/2214.aspx

周一在新员工培训上为他们做了一个PetShop 4.0的talk,(感谢Zou老师给我这么好的一个机会,让我自今还觉得相当incredible,不过也证明了MSRA里面,Imporsible is nothing)

结果这两天不停有人跑来问我各种各样的Pet Shop问题,还好凭着自己的三脚猫功夫,能够把大部分人心满意足地打发走。但是昨天就碰上了一个问题,让我一开始也是百思不得其解。那就是Pet Shop中的缓存机制。

首先,Pet Shop中应用了ASP.Net 2.0中新增加的SqlCacheDependency能力,通过配置文件的设置,Framwork会自动定时轮询数据库中的一个监视表,而被监视表上有 一个触发器,在发生Insert、Update、Delete操作的时候就会改变监视表中ChangeID的值。这样一来,每当ChangeID发生了变 化,SqlCacheDependency就会自动使得Cache失效,那么下一次请求到达服务器时,程序将直接从数据库中提取出最新的数据并重新插入 Cache中,于是Cache的过期就不必手动编码操作了!

但是仔细查看代码会发现,Web项目的App_Code文件夹下有一系列的DataProxy类,里面都是静态方法,通过代码不难看出,这些类是用 于数据访问的,即首先判断是否所需数据已经存在于缓存中,若有,则直接访问缓存,若无,则访问数据库返回填充好的数据实体对象并缓存起来,插入缓存时,正 使用了SqlCacheDependency机制。

可是如果你在整个Solution里面搜索相应的DataProxy类,你会一无所获!难道这些代码只是说放在那里而已,难道它们也只是为了显示一下自己的新锤子?

一开始我也百思不得其解,后来看到页面里面的代码时,猛地恍然大悟。原来Pet Shop中实现了两套缓存方式,一种是类似于DataProxy的那种传统方法,将数据实体缓存起来,另一种则是结合了ASP.NET的页面缓存机制来实现的。

查看ProductsControl.ascx文件你会在头部发现一个伪指令声明:<%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>第一个参数是定义了控件的过期时间,第二个参数则定义了区分缓存的参数(2.0新特性),然后查看 ProductsControl.ascx.cs文件你会发现在protected void PageChanged方法中有productsList.DataSource = product.GetProductsByCategory(categoryKey);语句,这个语句是直接使用DAL访问数据库,(没有先查询缓 存,这也是很多人百思不得其解的地方)但是关键不在这里,在protected void Page_Load方法中有一行语句this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();这条语句的作用就在于将SqlCacheDependency同样应 用于页面的缓存过期。

这样一来,缓存的就不光是数据实体类而已,而是整个控件被Render出来后的html!这样一来还省去了每次访问页面时的Render操作,效率显然比光缓存实体类高得多!

ps: 如果你想使用光缓存实体类的方式,那么请删除ascx文件中的OutputCache声明,注释掉page_load中的过期策略语句,然后将 productsList.DataSource = product.GetProductsByCategory(categoryKey);改为productsList.DataSource = ProductDataProxy.GetProductsByCategory(categoryKey);其他页面同理操作。

结论是PetShop实现了两种缓存方式,但是默认它使用了更高效的那种。可惜又让初学者看不懂了,22个项目,残念ing...

JFinal3.0初体验(二)店铺列表

代码: https://code.csdn.net/u012995856/gxshop/tree/master 效果: 点击图片或者店铺名称可调转店铺首页数据库设计: shop_id是生成...
  • u012995856
  • u012995856
  • 2017年03月29日 18:08
  • 641

33---varnish 4.0 工作机制和配置实例解析(上)

这两天在看varnish,感慨一句,这软件真不错!!! ============ 功能&程序包: 首先varnish是反向HTTP代理,是具有强大缓存功能的代理,因此也被称之为web加速器或ht...
  • xiaohaiyinyu
  • xiaohaiyinyu
  • 2017年07月01日 15:20
  • 343

Spring4.1新特性——Spring缓存框架增强

本文其实不应该算作Spring4.1新特性,该测试框架目前是独立于Spring Framework发展的。Spring MVC Test HtmlUnit提供了Spring MVC测试框架、Htm...
  • qwe6112071
  • qwe6112071
  • 2016年03月14日 19:36
  • 698

PET重建技术 MLEM迭代法(C++)(一) 原理及成像

PET重建 MLEM迭代原理 讲解 以及C++成像代码 如有错误请在留言中指正 如有学习需要, 不懂得可以再留言...
  • qq_27664383
  • qq_27664383
  • 2015年11月09日 18:39
  • 1649

对缓存机制的理解

概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对...
  • qingtong_gu
  • qingtong_gu
  • 2016年12月20日 13:56
  • 2118

【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

Http 缓存机制作为 web 性能优化的重要手段,对从事 Web 开发的小伙伴们来说是必须要掌握的知识,但最近我遇到了几个缓存头设置相关的题目,发现有好几道题答错了,有的甚至在知道了正确答案后依然不...
  • Tencent_Bugly
  • Tencent_Bugly
  • 2016年12月19日 15:18
  • 3218

C#pet shop 4.0三层架构分析(转)

微软的pet shop 4.0  去csdn上下载  输入petshop 回车就有源码和文档  如果找不到 我发给你  ================================...
  • zhaowei303
  • zhaowei303
  • 2014年11月23日 23:17
  • 214

【Redis缓存机制】10.主从模式

redis的主从模式 (1)介绍 redis存储数据是在内存中运行的,运行速度比关系型数据库要快一些。而且它具有SortSet/Hash 等具有特色的数据类型,这是其它数据库无法比拟的。 redis...
  • u013517797
  • u013517797
  • 2016年12月02日 14:14
  • 4110

常用缓存Cache机制的实现

Cache 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。 缓存主要可分为二大类: ...
  • qq_27202739
  • qq_27202739
  • 2017年05月23日 21:22
  • 447

Hibernate缓存机制和MyBatis缓存机制

原文地址:https://my.oschina.net/u/1445731/blog/416200?p=%7B%7BtotalPage%7D%7D 摘要: mybatis缓存分为1级缓存和2级缓存 ...
  • tanga842428
  • tanga842428
  • 2016年09月29日 09:42
  • 9210
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Pet Shop 4.0的缓存机制
举报原因:
原因补充:

(最多只允许输入30个字)