秋色园QBlog技术原理解析:性能优化篇:字节、缓存、并发(十二)

简介:

文章回顾:

复制代码

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://www.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 的基础优化策略,下节继续介绍的优化策略后续部分,敬请关注。

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2011/05/05/2037791.html

相关文章
|
2月前
|
监控 安全 算法
Java并发基础:LinkedTransferQueue全面解析!
LinkedTransferQueue类实现了高效的线程间数据传递,支持等待匹配的生产者-消费者模式,基于链表的无界设计使其在高并发场景下表现卓越,且无需担心队列溢出,丰富的方法和良好的可扩展性满足了各种复杂应用场景的需求。
Java并发基础:LinkedTransferQueue全面解析!
|
2月前
|
Java 程序员 API
Java并发基础:concurrent Flow API全面解析
java.util.concurrent.Flow定义了响应式编程的核心接口,促进了Java在异步数据处理和背压机制方面的标准化,这使得第三方库如Reactor和RxJava能够基于这些接口提供丰富的实现和功能,同时简化了响应式编程在Java中的使用,Flow API增强了Java在并发编程领域的灵活性,使得处理异步数据流变得更加自然和高效。
107 0
Java并发基础:concurrent Flow API全面解析
|
2月前
|
安全 Java API
Java并发基础:Exchanger全面解析!
Exchanger类的优点在于能够简洁高效地实现两个线程间的数据交换,通过Exchanger,开发者可以避免复杂的锁和同步机制,降低并发编程的难度,同时,它还提供了线程安全的数据交换保障,使得多线程协作更为可靠、易用性和高效性。
Java并发基础:Exchanger全面解析!
|
2月前
|
存储 负载均衡 安全
Java并发基础:ArrayBlockingQueue全面解析!
ArrayBlockingQueue类是一个高效、线程安全的队列实现,它基于数组,提供了快速的元素访问,并支持多线程间的同步操作,作为有界队列,它能有效防止内存溢出,并通过阻塞机制平衡生产者和消费者的速度差异,它还提供了公平性和非公平性策略,满足不同场景下的需求。
Java并发基础:ArrayBlockingQueue全面解析!
|
1月前
|
存储 缓存 算法
Java并发基础:原子类之AtomicMarkableReference全面解析
AtomicMarkableReference类能够确保引用和布尔标记的原子性更新,有效避免了多线程环境下的竞态条件,其提供的方法可以轻松地实现基于条件的原子性操作,提高了程序的并发安全性和可靠性。
Java并发基础:原子类之AtomicMarkableReference全面解析
|
2月前
|
缓存 安全 算法
Java并发基础:原子类之AtomicInteger全面解析
【2月更文挑战第2天】AtomicInteger类提供了线程安全的整数操作,它通过利用底层硬件的原子性指令,能够在多线程环境中高效地实现整数的无锁更新,避免了传统同步机制带来的性能开销,在高并发场景下成为计数器可大幅提高程序的执行效率,同时又保证了数据一致性。
64 16
Java并发基础:原子类之AtomicInteger全面解析
|
2月前
|
存储 算法 安全
Java并发基础:原子类之AtomicBoolean全面解析
【2月更文挑战第1天】 AtomicBoolean类优点在于能够确保布尔值在多线程环境下的原子性操作,避免了繁琐的同步措施,它提供了高效的非阻塞算法实现,可以大大提成程序的并发性能,AtomicBoolean的API设计非常简单易用。
Java并发基础:原子类之AtomicBoolean全面解析
|
2月前
|
数据采集 Java API
Java并发基础:CyclicBarrier全面解析!
CyclicBarrier的优点在于实现了线程间的相互等待与协同,确保所有线程在达到预定屏障点后才能继续执行,它支持屏障的重复使用,非常适合多轮次的任务同步,此外,CyclicBarrier还允许在屏障点执行特定操作,为复杂的多线程协作提供了便利。
Java并发基础:CyclicBarrier全面解析!
|
2月前
|
存储 安全 Java
Java并发基础:CopyOnWriteArraySet全面解析
CopyOnWriteArraySet类的优点在于能够实现无锁读取,确保高并发下的读取性能,同时,写操作通过复制底层数据来保证数据一致性,避免了多线程间的数据冲突,因此,它非常适合读多写少且对数据一致性要求较高的场景。
Java并发基础:CopyOnWriteArraySet全面解析
|
2月前
|
前端开发 Java API
Java并发基础:CompletableFuture全面解析
CompletableFuture类使得并发任务的处理变得简单而高效,通过简洁的API,开发者能轻松创建、组合和链式调用异步操作,无需关心底层线程管理,这不仅提升了程序的响应速度,还优化了资源利用率,让复杂的并发逻辑变得易于掌控。
Java并发基础:CompletableFuture全面解析

推荐镜像

更多