QBlog

This blog will record the growth associated with the Autumn Garden distance and the history of the development progress and other relevant circumstances
Bulletin
Welcome to Autumn Garden official blog, please: download and use CYQBlog system, and make your comments and Recommendations.
Article Archive
Article
秋色园QBlog技术原理解析:性能优化篇:字节与缓存与并发(十二)
2011/5/4 23:01:20

文章回顾:

1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用

2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程

3: 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三) --介绍如何实现无后缀URL

4: 秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四) --介绍URL如何定位到处理程序

5: 秋色园QBlog技术原理解析:Module之页面基类设计(五) --介绍创建基类和自定义生命周期

6: 秋色园QBlog技术原理解析:Module之页面基类-生命周期流程(六) --介绍基类生命周期内部业务

7: 秋色园QBlog技术原理解析:Module之基类生命周期-页面加载(七) --介绍界面html加载原理

8: 秋色园QBlog技术原理解析:Web之页面处理-内容填充(八) --介绍html的内容是如何填充

9: 秋色园QBlog技术原理解析:独创的多语言翻译机制(九) --介绍html多语言翻译原理

10: 秋色园QBlog技术原理解析:页面内容填充及多语言翻译流程演示示例(十) --总结演示示例代码

11:秋色园QBlog技术原理解析:页面Post提交机制(十一) --介绍如果Post提交数据

附章:

1:秋色园QBlog技术原理解析:博客一键安装工具技术实现[附源码下载] --开源秋色园安装工具原理

2:如何安装部署秋色园CYQBlog站点

3:Windows7下如何安装部署秋色园CYQBlog站点

ps:秋色园QBlog下载地址http://cyqdata.com/download/article-detail-427

上节回顾:

上一节中,介绍了 秋色园QBlog 是如何提交数据到后台并处理的,因此本系列原理解析,基本架构已讲解完毕,接下的会补充几篇相关文章,继续介绍秋色园QBlog的相关内容。

本节介绍:

本节介绍基础的网站优化:秋色园QBlog都进行了哪些基础优化?往下看。

优化一:字节

为了减少传输的字节,通常都会采取一些压缩[html,js,css]

1:压缩html:秋色园采用将Html当xml方式加载的手段,默认就是无空格状态,因此天生就有这优势,连GZip压缩也省了。

2:压缩CSS:本人对CSS不精通,没办法整体优化,利用VS格式化:一条样式格式化成一行,再删除一些没用到的CSS样式,勉强少了几K。

3:压缩js:秋色园没有用js,所以没这方面的开销,省力又省心。

优化二:缓存

秋色园的缓存,全使用 CYQ.Data.Cache下:CacheManage

在长久的开发过程中,秋色园中形成了以下几种缓存:

1:缓存表架构:CYQ.Data 数据框架的默认缓存

2:缓存html架构:未经处理的原始html界面,即默认的皮肤的html[秋色园的缓存机制]

3:缓存经过处理的html架构:包括css路径处理,语言翻译等,但不包括数据填充,[秋色园的缓存机制]

4:缓存页面:缓存最后的html[秋色园的缓存机制]

缓存是层层递进的,有了以上的几层缓存保障,性能是刷刷的上去了,页面打开也很快。

三:负载来临,问题出现,失控的缓存

秋色园的运行环境:国外Godaddy的虚拟主机的子目录+Access数据库

天生不佳硬件的条件,让过往的一些优化在这里显的有些脆弱,坚持不了多久,文章上到几万,性能又再次走到边缘,首页时快时慢,缓存似有似无,并发写把站点折腾的一度打不开。

主要表现在以下几个大方面:

1:并发写操作:Access本身在并发写时经常有死锁发生,很纠结。

2:缓存的过期:几乎是不可控的,有时打开慢[缓存失效了],有时打开快[刚好缓存已起来了]。

3:翻页的速度:在访问量少的页面,特别是翻页,由于没有缓存的照顾,每次打开都3-5秒,让人感觉一个字:慢。

优化四:Access的并发控制处理

需要找到站点经常性写数据的操作点:

1:用户后台:

解决手段:通过增加Lock来避免并发

由于所有的更新删除插入,都执行的:ExeNonQuery函数,

所以只要以在底层这函数里加一个可配置的项,来决定启用Lock,解决。

2:高频率的文章与用户访问计数:

解决手段:通过一些手段来减少更新的频率。

问题:如果每次用户访问,都执行更新计数,这对Access来说就太可怕了:会造成经常性的死锁,访问也会受影响。
采用的措施:采用了缓存计数+概率性更新,来更新到数据库,目前有效的解决了这一问题。
副作用:就是由于缓存的丢失,会丢失小部分的统计数字,不过用户访问量,并不需要太准确的数字,因此此手法还算合适。

优化五:掌控全局缓存,合理调优

 缓存失控了?

缓存怎么用:

cache.Add(key,obj,times);//将一个对象存入缓存一段时间

缓存何以失控?

试想下,缓存的一段时间你是怎么定的?

敲代码时就给了想当然的时间,对不?不对?不?对?不对?

好了,说问题,正常情况下,缓存是怎样失控的?

1:不知道缓存的对象在内存中的使用情况,缺少同步与清理机制。

2:没用的缓存占了大量内存、内存回收看不见、性能优化全靠猜猜猜。

失控的效果与后果?

效果:

公司的服务器,配置高,内存大,缓存随一放,时间值设大,问题就不大,效果良好见效快。对外可以展示自己做的站点性能高,访问快,高手就这样造成出来了。

后果:

穷人的,用的虚拟主机,或VPS,内存就一丁点,资源很有限,再乱扔内存,对性能提升反而无益:内存不断的在超出,回收,超出,回收中循环。
结果:缓存成了虚设,站点好一会,慢一会,天天纠结中循环。

秋色园缓存早期情况:

失控状态,页面时快时慢,缓存时有时无,有人说慢有人说快。

可控的缓存设计

一个良好的系统,必须对缓存的使用情况有所掌控,再根据实际环境做适当缓存调整策略,进而同样的资源,有更多的发挥。

秋色园缓存目前情况

为了全局综合性的提升缓存性能,急需要对全局缓存有所掌握,才能做到相对合理的调优。为此,对CYQ.Data的缓存机制做了一些优化与调整及信息输出,以掌握全局情况。

这里截一张秋色园的缓存全局情况图:

如上图:

这是秋色园整站的缓存信息,通过这样的信息表,即可掌握哪些缓存是用的多,哪些缓存用的少,可以合理的设置时间及清除策略。

其它:

使用 CYQ.Data.Cache 来缓存信息,就可以打印全站的缓存列表,掌握全局,做到合理优化?

对的!!!版本要求?近期会发布新版本,将带此功能,敬请关注。

总结:

本节介绍了秋色园QBlog 的基础优化策略,下节继续介绍的优化策略后续部分,敬请关注。

下一篇:秋色园QBlog技术原理解析:性能优化篇:全局的SQL语句优化(十三) --介绍全局掌握SQL,进行针对性优化

 

Autumn Garden is QBlog the official site, created by the passing autumn, based on the framework data layers developed cyqdata support multi-user, multi-language, multi-database (access, mssql, oracle), directory level url and other powerful blog system
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"
 Tech Analysis   Browse(7193)   Comment(3)   Tag 网站性能优化,缓存,秋色园,qblog,技术,原理,解析,路过秋天
一千年以後 : 2011/7/25 22:07:06
Dictionary<T,T>的 add(T,T) 还是不明白
游客[注册][14.108.81.*] : 2011/7/1 20:37:32
看了你的教程及文章,首先感兴趣的是那个缓存类,但我在测试的时候会出现错误.

代码也很简单,
Cache.CacheManage.Instance.Add(username, DateTime.Now, null, 20);
错误内容如下:


错误信息:Index was outside the bounds of the array.
堆栈内容:
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
at Cache.CacheManage.Insert(String key, Object value, String filePath, Double cacheTimeMinutes)
at Cache.CacheManage.Add(String key, Object value, String filePath, Double cacheTimeMinutes)





能告诉应该怎么解决吗?谢谢了.
wwan : 2011/5/9 7:14:13
终于大体的看完了,还是不是太明吧。呵呵,继续研究。
reply多看几篇,细细体会。
:Register
  
Copyright © 2010-2020 power by CYQ.Blog - Autumn v2.0 All Rights Reserved