电商站点,性能优化

问题:

1)当大型站点系统>10万人

一个小时内。会跟数据库交互10万次(国内有京东,淘宝),这就会出现数据库瓶颈,每一个数据库最大连接数(socket)2000
在某一段短临时间内1万人,会跟数据库发生1万次交互,2000-8000【30秒】 5000 3000
2000个用户非常快就能够到页面
5000个用户訪问页面比較慢
还有3000个用户会提示超时/server出现例外

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

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

2>2>缓存技术 (当数据更新比較快,几秒钟就更新一次,或者须要实时反映数据变化。或者页面具有非常多种风格。不便于生成静态页面。如BBS)

    A.页面缓存(view,html代码)

缺点:不能做到实时更新,长处:比二级缓存效率更高。

 
        在缓存的有效期内。显示的数据是没有变化的,仅仅有当缓存过期以后才会有变化。


        页面缓存分为局部缓存和全局缓存,全局缓存是缓存整个页面的html代码。页面缓存是缓存页面中的某一块区域的html代码。
        缓存的范围:application范围(全部人都能共享。比方说产品列表显示)session(仅仅针对某一个訪问者,比方说缓存某个用户的个人信息)
        OSCache默认的范围是application范围,能够通过scope属性来改动。
        缓存默认的有效时间是3600秒。也就是一小时。能够通过time属性来改动。


        refresh属性h假设设置为true,则能够强行清楚缓存。
        key属性的作用:假设不设置key属性,就依据用户输入的url来做缓存,假设用户输入的url改变,缓存也会改变。oscatche会把全部的值放到一个map中,通过   key value来做推断。

<body>
            <oscache:cache key="aaron" scope="session" time="15" refresh="${param.refresh }">
                <div>
                    <%=new Date() %>
                </div>
            </oscache:cache>
            <br>
            当前时间:<%=new Date() %>
        </body>
        人为清除缓存<flush/>标签:
        <oscache:flush scope="application" />清除application范围内的全部缓存
        <oscache:flush scope="session" key="foobar" />清除session范围内的key为foobar的缓存
        <oscache:flush scope="application" group="currencyData" />清除application范围内组名为currencyData的全部缓存。
        使用oscache实现页面的全局缓存
        <filter>
            <filter-name>CacheFilter</filter-name>
            <filter-class>com.opensymphony.oscache.web.filter.CacheFilter</filter-class>
            <init-param>
                <param-name>time</param-name>
                <param-value>7200</param-value>
            </init-param>
            <init-param>
                <param-name>scope</param-name>
                <param-value>application</param-value>
            </init-param>
        </filter>
        <filter-mapping>
                <filter-name>CacheFilter</filter-name>
                <url-pattern>/product/list/*</url-pattern>
        </filter-mapping>

  

  缓存的key将以请求的uri+查询字符窜组成,假设你訪问/oscache/index.jsp?

name=tt和/oscache/index.jsp?name=ppp将得到两分缓存。
        缓存在初次訪问页面时进行。兴许的请求将会返回缓存中的内容。

缓存中存放的内容为页面返回给用户的html代码。
        OSCache配置属性介绍
        cache.memory=true指定是否使用内存缓存,配置默觉得true。即使用内存缓存。
        cache.capacity=1000指定缓存的容量,默认的容量是无限的,我们能够为他设置缓存数量。


        假设要使用硬盘缓存。我们能够这样设置:
        cache.memory=false
        cache.path=d:\\cache(指定缓存保存的路径,注意:路径应该採用双\\符号)
        cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener
        cache.persistence.class用于设计持久化类
        我们既要考虑页面的数量,也要考虑机器的内存,假设内存不多的话easy引起内存耗尽。系统的性能反而下降。
        可是不妨用内存缓存。由于速度比較快,一般server的内存都大于10g,用于缓存产品列表页面够了。由于产品列表页面不会太多,如果我们有几万个的话,有一两个g就够了。
        CacheFilter的实现原理:

 

复制代码
 1 CacheFilter{
2 doFilter(request,response,chain){
3 String urlpath=req....;
4 if(oscache.contains(urlpath)){
5 String content=OsCache.getKey(urlpath);
6 response.write(content);
7 }else{
8 CacheHttpServletResponseWrapper wrapper=new CacheHttpServletResponseWrapper(response)
9 chain.doFilter(request,wrapper);
10 String content=wrapper.getContent();//获取server网client输出的html代码
11 OScache.put(urlpath,content);
12 response.write(content);
13 }
14 }
15
16 public CacheHttpServletResponseWrapper entends HttpServletResponseWrapper{
17 private String content;
18 public CacheHttpServletResponseWrapper(HttpServletResponse response){
19 ....
20 }
21 public void write(String content){
22 this.content=content;
23 }
24 public String getContent(){
25 return content;
26 }
27 }
28 }
复制代码


        页面缓存比二级缓存快的原因:当请求来之后系统就会交给过滤器,过滤器得到路径以后就会把缓存返回给client。
        二级缓存要经过action service 和jsp
    B.二级缓存(model/业务层,domain对象)长处:实时更新
    EHCache OSCache jbossCache(分布式缓存)
    第一步:导入ehcache的ehcache.jar文件(hibernate中有)
    第二部:在persistence.xml文件里加入以下配置项: 

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

 第三步:在实体类上面标注@Cache(region="cn.aaron.bean.Person",usage=CacheConcurrencyStrategy.READ_WRITE)
    第四步:在classpath以下放入ehcache.xml,内容模板例如以下: 

 

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?

>
2 <ehcache>
3
4 <diskStore path="D:\cache" />
5
6 <defaultCache maxElementsInMemory="10000" eternal="false" overflowToDisk="true"
7 timeToIdleSeconds="120"
8 timeToLiveSeconds="180"
9 diskPersistent="false"
10 diskExpiryThreadIntervalSeconds="60"/>
11
12 <cache name="cn.aaron.bean.Person" maxElementsInMemory="100"
13 eternal="false" overflowToDisk="true"
14 timeToIdleSeconds="300"
15 timeToLiveSeconds="600" diskPersistent="false" />
16 </ehcache>

复制代码

  注意<cache>节点中的name属性要和@Cache(region="cn.aaron.bean.Person",usage=CacheConcurrencyStrategy.READ_WRITE)中的region同样
    ehcache.xml文件里各项属性说明例如以下:
        defaultCache节点为缺省的缓存策略
        maxElementsInMemory 内存中最大同意的对象数量
        eternal 设置缓存中的对象是否永远只是期
        overflowToDisk 把溢出的对象放到硬盘上(对于本例而言,第1001个对象将存放在硬盘上)
        timeToIdleSeconds 指定缓存对象空暇多长时间会过期。过期的对象会被清除掉
        timeToLiveSeconds 指定缓存对象总的存活时间
        diskPersistent 当jvm结束时是否持久化对象
        diskExpiryThreadIntervalSeconds 指定专门用于清除过期对象的监听线程的轮询时间
    
3>数据源 连接池里面放一些连接对象
每次都能跟数据库建立连接socket(client)----socket(数据库)

4>SSI 对性能提升不是那么明显(有一点点作用)
Server Side Include, 通常称为“server端包括”技术。
使用了SSI技术的文件默认的后缀名为.shtml,SSI技术通过在html文件里增加SSI指令让webserver在输出标准HTML代码之前先解释SSI指令,
并把解释完毕后的输出结果和HTML代码一起返回给client。
在大部分项目中,我们主要使用了SSI的包括指令<!-#include virtual="global/foot.jsp"-->,
他的作用类似于JSP中的<jsp:include page="/global/foot.jsp"/>标签。


使用SSI主要有例如以下两点优势:
1 SSI技术是通用技术。它不受限于执行环境,在java,.net,CGI,ASP,PHP下都能够使用SSI技术
2 解释SSI指令的效率比解释JSP的效率快非常多。由于Servlet规范提供了太多的功能。这些功能都须要servlet引擎进行解释,所以效率比較低。


在眼下,大部分的门户站点都是用SSI技术。解释SSI文件最佳的server是Apache HTTP Server。
大型门户站点基本都使用这个来解释SSI文件。
配置有用SSI
眼下主流的webserver都提供SSI实现,我们仅仅须要打开SSI功能就能够使用。
tomcat也能够,可是并不会提高性能。由于使用的还是servlet引擎 .

posted @ 2017-08-05 14:21  jzdwajue  阅读(124)  评论(0编辑  收藏  举报