缓存真是个好东西,在大型的系统中可以有效地提升系统的速度,此乃废话就不多说了,在.Net 平台下面我把缓存从功用大致分为两类,数据对象缓存和页面输出缓存。对于数据缓存来讲是由System.Web.Caching.Cache这个类来实现,可以从上下文对象Context.Cache 来获取这个对象的引用。而页面/控件输出缓存则是由.Net环境在运行时依据头部的缓存申明来控制缓存策略。本文主要论证与数据缓存相关的一些应用与问题。

有人提到了"无法跨Web园共享数据的问题",虽然提到解决方案就是使用XML文件来存放缓存的键值,这里有一个疑惑,就是.Net的Web园既然是进程独立的又何来共享之说呢,真要是这样的话即便是通过XML文档写入缓存键值缓存的对象也不能同时在两个进程中共享,而这里获得的好处仅是避免了在其它的进程中读到了已在当前进程中失效的“脏”缓存数据,这样的话开几个Web园就会产生几个缓存的对象对系统资源的利用系就比较低了. 如果是用Web场布署的话浪费就更多了,也许是还少有论坛达到这样的规模故不在设计能力的范围中吧。CommunityServer也是使用了这个系统对象,并对它作了一些包装形成了CommunityServer.Components.CSCache这个类,还是不错的,可以在项目中选择使用。

基于这个类的应注实现还有EnterpriseLibrary的CacheBlock里面的NullBackingStore方式,但是为了满足多进程/服务器共程缓存数据的需求EntLib还提供了将SQL SERVER作为后端存储设备的方案,这样在性能要求不是太严,客户端连接不是太多的情况下也可以使用这种方式.只需要将EntLib 配置为共享数据库分区的工作方式即可,所有的CacheManager实例都有对缓存块的读写权,当然你也可配置为只允许一个实例写,其它的来读。

那么还有没有更好的办法呢,其实是有的。不过我很奇怪在.Net平台下居然没有“原生态”的分布式缓存解决方案,也许是俺孤陋寡闻吧,有哪位达人知道的请分享。还好我们有Memcached这东西,它在PHP平台上已经取得了巨大的成功,是优秀的分布式缓存解决方案,可以参看这篇文章 , 大型的站点上应该必不可少吧.有举的同学可以去看看, 另外还想好一个思路, 就是在EntLib的基础上作扩展实现IBackingStore 接口从BaseBackingStore派生一个实现出来,再经由Remoting或者ICE这样的分布式中间件技术应该也可以实现的类似的功能吧。

用XML作为缓存键的存储方式倒是一个不错的想法,这样在批量移除缓存项的时候就不需要作扫描而直接得到相应的缓存键值,跟分布式缓存作一个整合应当是一个不错的方案。

好了,让我们再回头看看Discuz!NT在页面缓存上有些什么高招。

总的说来我是不怎么喜欢.Net2.0提供的页面输出缓存功能,主要是不能手动地控制页面缓存的过期,而使有缓存依赖项似乎也有点不爽。事实上使用数据绑定控件相对来说是比较消耗资源的,同样的数据我用StringBuilder直接拼出来输出速度要快不少,测试代码比较简单我这里就不给了,大家可以自己去测去,Discuz!NT在设计中也大量地采用了这样的方法(怪不得速度这么快呢;))。一般来讲模版被保存后后台会在aspx目录生成对应的页面文件, 比如你有一个页面,上面需要显示一个来访者的姓名,它的伪代码看起来可能是这个样子。

模版文件内容show.html:

以下为引用的内容:

<html>

<body>

Hello, Your name is <% yourname %>

</body>

</html>

生成的文件 show.aspx

以下为引用的内容:

templateBuilder.AppendLine("<html>");

templateBuilder.AppendLine("<body>");

templateBuilder.AppendLine("Hello, Your name is " + this.yourname); templateBuilder.AppendLine("</body>");

templateBuilder.AppendLine("</html>");

生成的文件 show.aspx

以下为引用的内容:

templateBuilder.AppendLine("");

templateBuilder.AppendLine("");

templateBuilder.AppendLine("Hello, Your name is " + this.yourname); templateBuilder.AppendLine("");

templateBuilder.AppendLine("");

这里的this.yourname对应着相应页面后台类里面的一个属性,由程序在运行时进行初始化赋值,这样最后得到的页面执行结果就可以从这个templateBuilder对象的ToString()方法得到, templateBuilder也就是一个页面后台类里面的StringBuilder类的实例,最后在页面执行完毕后的OnLoad事件中根据不同的页面类型,如首页,频道首页,内容页等, 使用不同的缓存策略将页面执行结果的HTML代码插入到缓存中,下一个请求进来的时候在进入页面生命周期之前的HttpModule(这里面还包含地址重写功能代码)中判断这个缓存是否有效,直接从内存读取缓存发回客户端.这样速度当然就快了, 页面上看到的执行时间自然是0ms. 不过对于登陆用户来说由于要显示不同的登陆信息所以不能使用匿名的缓存文件版本,所以说一旦你登陆页面才会真正执行一次,但是上面要显示的数据都有独立的缓存项,所以仅仅是重新组装一次页面代码罢了,速度还是比较快的,在官方论坛上看到首页加载时间是15ms, 够快的了。

我以为连这个时间其实也是可以再节省节省的。比如用户登陆信息这部分东西可以生成一段JS, 在向浏览器发出了匿名用户的缓存版本时再判断如果用户登陆了就追加这样一段JS代码,在里面去把相应的HTML替换掉就可以了,也可以使用AJAX技术在客户端去取,这样就解决了已登陆用户和未登陆用户在共享缓存版本上的问题,至少在首页这一级是可以的吧,其它的主要页面不好说应该也差不多,我对论坛程序的流程不是很了解。

从另一个角度讲已登陆用户不应该速度比匿名用户还慢吧。

转载于:https://www.cnblogs.com/webnet/archive/2009/03/22/1418835.html

Net平台下的分布式缓存设计相关推荐

  1. 双11万亿流量下的分布式缓存

    摘要: 12月13-14日,由云栖社区与阿里巴巴技术协会共同主办的<2017阿里巴巴双11技术十二讲>顺利结束,集中为大家分享了2017双11背后的黑科技.本文是<双11万亿流量下的 ...

  2. 基于.net平台下大型分布式HIS系统之药房药库系统-石曼迪-专题视频课程

    基于.net平台下大型分布式HIS系统之药房药库系统-159人已学习 课程介绍         本次课程重点讲解药房药库系统中典型的几个环节,如:入库.入库审核.盘点.盘点审核.药房划价.门诊发药.住 ...

  3. .NET下实现分布式缓存系统Memcached

    [IT168 技术文档]在Web应用程序中,数据通常保存在RDBMS中,应用服务器从数据库中读取数据并在浏览器中显示.但随着数据量的增大.访问的集中,就会出现RDBMS的负载加重.数据库响应变慢.网站 ...

  4. 分布式技术与实战第六课 分布式缓存设计

    第33讲:不止业务缓存,分布式系统中还有哪些缓存? 缓存是分布式系统开发中的常见技术,在分布式系统中的缓存,不止 Redis.Memcached 等后端存储:在前端页面.浏览器.网络 CDN 中也都有 ...

  5. 深入理解分布式缓存设计

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 在高并发的分布式的系统中,缓存是必不可少的一部分.没有缓存对系统的加速和阻挡大量的请求直接落到系统的底层,系统是很难撑住高并发 ...

  6. 揭秘!双11万亿流量下的分布式缓存系统 Tair

    阿里妹导读:本文以双11面临的挑战为背景,从Tair(阿里自研高速缓存系统)发展和应用开始谈起,重点分享了性能优化方面的实践,最后对缓存热点难题给出了解决方案,希望能对大家的工作有所启发. 本文作者为 ...

  7. 双11万亿流量下的分布式缓存系统 Tair

    阿里妹导读:本文以双11面临的挑战为背景,从Tair(阿里自研高速缓存系统)发展和应用开始谈起,重点分享了性能优化方面的实践,最后对缓存热点难题给出了解决方案,希望能对大家的工作有所启发. 本文作者为 ...

  8. 我发起了一个 .Net Core 平台上的 分布式缓存 开源项目 ShareMemory 用于 取代 Redis...

    Redis 的 安装 是 复杂 的, 使用 是 复杂 的, Redis 的 功能 是 重型 的, Redis 本身的 技术实现 是 复杂 的 . Redis 是用 C 写的, C 语言 编写的代码需要 ...

  9. android ffmpeg p2p,Android平台下流媒体播放器的设计与应用

    摘要: 随着流媒体技术.移动通信技术和嵌入式技术的迅速发展,已经客观上改变了人们的生活和工作方式.传统的基于PC的流媒体交互方式已不能满足人们多元化的需求方式;基于IP流媒体技术的嵌入式流媒体智能终端 ...

最新文章

  1. 图像识别落地机会最多 腾讯全面输出视觉AI
  2. Flink状态管理与CheckPoint、Savepoint
  3. 链接 动态链接 静态链接
  4. 移动端 长按事件_Flutter事件监听
  5. feign调用接口参数可以为null吗_FeignClient调用POST请求时查询参数被丢失的情况分析与处理...
  6. 支持M1芯片mac 达芬奇17中文版(详细安装教程) DaVinci Resolve Studio 17.3.1b5
  7. Linux多网口绑定配合华为5700 eth-trunk技术,提高网络性能
  8. 体验QQ2011Beta3带来的变化和惊喜
  9. 在线等:“手里 5 个 offer,优选头条还是阿里?”
  10. C/C++[codeup 1805]首字母大写
  11. 万年历算法介绍(C程序)
  12. 找到某个关键字 同义词词林 python_python-004-标识符
  13. 9月第1周基金排行榜 | TokenInsight
  14. 1114:白细胞计数(C++)
  15. python kivy 控件(小部件)的属性集合
  16. Java--UML类图--使用/详解
  17. oCPC实践录 | 广告算法工程师的自我修养
  18. 实验吧-CTF-web-头有点大貌似有点难看起来有点难(学习笔记)
  19. python-pep8规范
  20. Zabbix优化深信服AC的设备运行时间监控项

热门文章

  1. 第二章 向量(a)接口与实现
  2. getBoundingClientRect()方法
  3. python--输出spwm的数组
  4. [笔记]NumPy基础操作
  5. jquery 只能输入汉字
  6. BZOJ1409 : Password
  7. 一幅画十六芒星盾---程序员or艺术家
  8. VLC RTP Over TCP
  9. Linux添加/删除用户和用户组
  10. 十种创业病 你得了几个?