51Testing软件测试论坛

标题: 电商网站,性能优化 [打印本页]

作者: 测试积点老人    时间: 2018-12-3 16:52
标题: 电商网站,性能优化
问题:
1)当大型网站系统>10万人

一个小时内,会跟数据库交互10万次(国内有京东,淘宝),这就会出现数据库瓶颈,每个数据库最大连接数(socket)2000
在某一段短暂时间内1万人,会跟数据库发生1万次交互,2000-8000【30秒】 5000 3000
2000个用户很快就可以到页面
5000个用户访问页面比较慢
还有3000个用户会提示超时/服务器出现例外

这是访问性能的问题,原因是数据库瓶颈。

解决方案:
1>页面静态化
解决方案:使用模板技术(Velocity[9-10年]/Freemarket[5-6年])

2>缓存技术 (当数据更新比较快,几秒钟就更新一次,或者需要实时反映数据变化,或者页面具有很多种风格,不便于生成静态页面。如BBS)
A.页面缓存(view,html代码)

缺点:
不能做到实时更新
优点:

  1. <body>
  2.             <oscache:cache key="aaron" scope="session" time="15" refresh="${param.refresh }">
  3.                 <div>
  4.                     <%=new Date() %>
  5.                 </div>
  6.             </oscache:cache>
  7.             <br>
  8.             当前时间:<%=new Date() %>
  9.         </body>
  10.         人为清除缓存<flush/>标签:
  11.         <oscache:flush scope="application" />清除application范围内的所有缓存
  12.         <oscache:flush scope="session" key="foobar" />清除session范围内的key为foobar的缓存
  13.         <oscache:flush scope="application" group="currencyData" />清除application范围内组名为currencyData的所有缓存。
  14.         使用oscache实现页面的全局缓存
  15.         <filter>
  16.             <filter-name>CacheFilter</filter-name>
  17.             <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
  18.             <init-param>
  19.                 <param-name>time</param-name>
  20.                 <param-value>7200</param-value>
  21.             </init-param>
  22.             <init-param>
  23.                 <param-name>scope</param-name>
  24.                 <param-value>application</param-value>
  25.             </init-param>
  26.         </filter>
  27.         <filter-mapping>
  28.                 <filter-name>CacheFilter</filter-name>
  29.                 <url-pattern>/product/list/*</url-pattern>
  30.         </filter-mapping>
复制代码
缓存的key将以请求的uri+查询字符窜组成,如果你访问/oscache/index.jsp?name=tt和/oscache/index.jsp?name=ppp将得到两分缓存。

缓存在初次访问页面时进行,后续的请求将会返回缓存中的内容。缓存中存放的内容为页面返回给用户的html代码。

OSCache配置属性介绍


如果要使用硬盘缓存,我们可以这样设置:


我们既要考虑页面的数量,也要考虑机器的内存,如果内存不多的话容易引起内存耗尽,系统的性能反而下降。
但是最好还是用内存缓存,因为速度比较快,一般服务器的内存都大于10g,用于缓存产品列表页面够了。因为产品列表页面不会太多,假设我们有几万个的话,有一两个g就够了。
CacheFilter的实现原理:
  1. CacheFilter{
  2. 2 doFilter(request,response,chain){
  3. 3 String urlpath=req....;
  4. 4 if(oscache.contains(urlpath)){
  5. 5 String content=OsCache.getKey(urlpath);
  6. 6 response.write(content);
  7. 7 }else{
  8. 8 CacheHttpServletResponseWrapper wrapper=new CacheHttpServletResponseWrapper(response)
  9. 9 chain.doFilter(request,wrapper);
  10. 10 String content=wrapper.getContent();//获取服务器网客户端输出的html代码
  11. 11 OScache.put(urlpath,content);
  12. 12 response.write(content);
  13. 13 }
  14. 14 }
  15. 15
  16. 16 public CacheHttpServletResponseWrapper entends HttpServletResponseWrapper{
  17. 17 private String content;
  18. 18 public CacheHttpServletResponseWrapper(HttpServletResponse response){
  19. 19 ....
  20. 20 }
  21. 21 public void write(String content){
  22. 22 this.content=content;
  23. 23 }
  24. 24 public String getContent(){
  25. 25 return content;
  26. 26 }
  27. 27 }
  28. 28 }
复制代码
       页面缓存比二级缓存快的原因:当请求来之后系统就会交给过滤器,过滤器得到路径以后就会把缓存返回给客户端。

二级缓存要经过action service 和jsp
B.二级缓存(model/业务层,domain对象)
优点:实时更新
EHCache OSCache jbossCache(分布式缓存)

  1. 1 <property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
  2. 2 <property name="hibernate.cache.use_second_level_cache" value="true"/>
  3. 3 <property name="hibernate.cache.use_query_cache" value="false"/>
复制代码

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. 2 <ehcache>
  3. 3
  4. 4 <diskStore path="D:\cache" />
  5. 5
  6. 6 <defaultCache maxElementsInMemory="10000" eternal="false" overflowToDisk="true"
  7. 7             timeToIdleSeconds="120"
  8. 8             timeToLiveSeconds="180"
  9. 9              diskPersistent="false"
  10. 10             diskExpiryThreadIntervalSeconds="60"/>
  11. 11
  12. 12 <cache name="cn.aaron.bean.Person" maxElementsInMemory="100"
  13. 13              eternal="false" overflowToDisk="true"
  14. 14              timeToIdleSeconds="300"
  15. 15             timeToLiveSeconds="600" diskPersistent="false" />
  16. 16 </ehcache>
复制代码
注意<cache>节点中的name属性要和@Cache(region="cn.aaron.bean.Person",usage=CacheConcurrencyStrategy.READ_WRITE)中的region相同

ehcache.xml文件中各项属性说明如下:


3>数据源 连接池里面放一些连接对象
每次都能跟数据库建立连接socket(client)----socket(数据库)

4>SSI 对性能提升不是那么明显(有一点点作用)
Server Side Include, 通常称为“服务器端包含”技术。

使用了SSI技术的文件默认的后缀名为.shtml,SSI技术通过在html文件中加入SSI指令让web服务器在输出标准HTML代码之前先解释SSI指令,并把解释完成后的输出结果和HTML代码一起返回给客户端。
在大部分项目中,我们主要使用了SSI的包含指令<!-#include virtual="global/foot.jsp"-->,他的作用类似于JSP中的<jsp:include page="/global/foot.jsp"/>标签。

使用SSI主要有如下两点优势:


在目前,大部分的门户网站都是用SSI技术,解释SSI文件最佳的服务器是Apache HTTP Server。
大型门户网站基本都使用这个来解释SSI文件。
配置实用SSI
目前主流的web服务器都提供SSI实现,我们只需要打开SSI功能就可以使用。
tomcat也可以,但是并不会提高性能,因为使用的还是servlet引擎 .


作者: songlei817816    时间: 2018-12-3 22:41

作者: Miss_love    时间: 2020-12-29 09:14
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2