关于定制oscache页面缓存

关于定制oscache页面缓存
关于定制oscache页面缓存

背景:

oscache作为jsp页面缓存,提供了两种模式:

1、缓存整个页面;

2、缓存局部页面。

或许是我本人的了解不足,我发现oscache存在以下问题:

第一种方式使用简单,但是问题就是不能及时刷新,刷新策略不灵活。

而第二种方式虽然灵活,但是修改的jsp文件太多,侵入太大,可读性变差,并且,根据我的理解, 请求从servlet转发到jsp的时候,jsp所需要的一些值已经查出来了,所以就算做了缓存也是没用的。

这个有点难以理解,举个例子来说:

show.jsp

${ request.someMap }

比如上面的jsp,jsp页面需要一个map,而这个map是从数据库查询的。我们肯定希望oscache可以省略这个查询,但是大家都知道,一个请求过来的流程:

请求--→ tomcat容器-→ servlet (servlet组织数据,放入request attribute)--→jsp --→ tomcat容器,也就是请求出来servlet 之后,转到jsp 之前,jsp锁需要的数据已经在servlet中查询出来了,所以jsp 的局部cache 是没有任何意义的。(我不知道其他人是如何做的)

由于以上问题,我决定采用oscache的整个页面缓存,但是定制他的更新时间。

基本思路:

1、自定义配置文件,定义哪些url需要缓存,缓存范围(session、application),过

期时间。如:

2、自定义filter重写CacheFilter,初始化的时候读取配置文件并解析缓存。

3、在doFilter的方法里面,如果请求的uri匹配上了配置文件里面的配置,则调用

CacheFilter的doFilter 走缓存,否则直接放过去,没有缓存。

4、为了能动态刷新缓存,需要判断缓存的最后更新时间与当前时间差是否超出了配置

文件中配置的时间,是的话就刷新,否则不刷新。这个需要自定义刷新策略:写一

个类实现EntryRefreshPolicy接口,并在我们自己的filter初始化的时候,调用

cacheFilter的setExpiresRefreshPolicy设置新的更新策略。EntryRefreshPolicy的

needsRefresh方法传入一个CacheEntry对象,为了将此对象与配置文件中配置的对

应起来,我们需要自定义CacheEntry的key,使key 中包含我们在配置文件中配置

的id。自定义key的生成规则需要重写cacheFilter的createCacheKey方法。具体参

考下面的代码。

5、动态更新的问题:我们在进行了操作之后,希望能刷新相关的缓存资源。比如我

评论了文章,那么可能需要刷新文章这个页面的缓存。这个时候需要手动调用一

下刷新接口,ServletCacheAdministrator. flushGroup(String group), 而如何获取我们已

知的uri的对应的groupName又成了问题,为此还需要自定义group生成的策略:ICacheGroupsProvider接口,并在我们的filter里面调用cacheFilter的

setCacheGroupsProvider方法设置新的组名生成策略。

6、这样一切问题都做好了,只要评论了一个文章,我们只要调用一下刷新的方法

就好了。

详细代码示例:

1、关于配置文件的东东:

import javax.servlet.jsp.PageContext;

/**

* 配置文件的模型

* @author wupeng

*

*/

public class CachedUrl {

private String id;

private String uri;

private Pattern pattern;

private int scope;

private long expires;//过期时间,单位分钟

private long expiresInMillis;//过期时间,毫秒private boolean needRefresh;

public CachedUrl(){

scope = PageContext.APPLICATION_SCOPE; needRefresh =false;

expires =60;

}

public String getId(){

return id;

}

public void setId(String id){

this.id = id;

}

public String getUri(){

return uri;

}

public void setUri(String uri){

this.uri = uri;

pattern = https://www.360docs.net/doc/e417129959.html,pile(uri);

}

public int getScope(){

return scope;

}

public void setScope(int scope){

if(scope == PageContext.SESSION_SCOPE || scope == PageContext.APPLICATION_SCOPE){

this.scope = scope;

}

}

public boolean isNeedRefresh(){

return needRefresh;

}

public void setNeedRefresh(boolean needRefresh){

this.needRefresh = needRefresh;

}

public long getExpires(){

return expires;

}

public void setExpires(long expires){

this.expires = expires;

this.expiresInMillis = expires *60*1000;

}

public void setExpires(String expiresString){

try{

if(expiresString !=null&&!"".equals(expiresString)){ long time = Long.parseLong(expiresString);

this.setExpires(time);

}

}catch(Exception e){

e.printStackTrace();

}

}

public long getExpiresInMillis(){

return expiresInMillis;

}

public void setExpiresInMillis(long expiresInMillis){ this.expiresInMillis = expiresInMillis;

}

public Pattern getPattern(){

return pattern;

CacheUrlParser 解析一下配置

package com.ttyc.sns.utils.cache;

import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.Collection;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.servlet.jsp.PageContext;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

/**

* 解析配置文件

* @author wupeng

*

*/

public class CacheUrlParser {

/**

*

* @param files

* @return uri - CachedUrl

*/

public static Map parseCachedUrlFromXML(Collection files){

SAXReader sax =new SAXReader();

Map map =new HashMap();

try{

for(String file : files){

Document xmlDoc = sax.read(new File(file)); map.putAll(parse(xmlDoc.getRootElement()));

}

}catch(DocumentException e){

e.printStackTrace();

}

return map;

}

/**

*

* @param files

* @return uri - CachedUrl

*/

public static Map

parseCachedUrlFromXML(InputStream is){

SAXReader sax =new SAXReader();

Map map =new HashMap();

try{

Document xmlDoc = sax.read(is);

map.putAll(parse(xmlDoc.getRootElement()));

}catch(DocumentException e){

e.printStackTrace();

}finally{

try{

if(is !=null){

is.close();

}

}catch(IOException e){

e.printStackTrace();

}

}

return map;

}

@SuppressWarnings("unchecked")

public static Mapparse(Element element){ Map map =new HashMap();

List elements =new ArrayList();

if(element.isRootElement()){

elements.addAll(element.elements("cache"));

}else{

elements.add(element);

}

for(Element e :elements){

CachedUrl url =new CachedUrl();

url.setId(e.attributeValue("id"));

url.setUri(e.attributeValue("url"));

String scope = e.attributeValue("scope");

if("session".equalsIgnoreCase(scope)){

url.setScope(PageContext.SESSION_SCOPE);

}else if("application".equalsIgnoreCase(scope)){ url.setScope(PageContext.APPLICATION_SCOPE);

}

url.setNeedRefresh(false);

url.setExpires(e.attributeValue("expires"));

map.put(url.getUri(), url);

}

return map;

}

}

*

*/

public class OSCacheStaticVariables {

private static final Map URI_CACHEDURL = new ConcurrentHashMap();

private static ServletCacheAdministrator admin =null;

private static ServletContext servletContext =null;

private static FilterConfig config =null;

private static Properties osCacheProps =null;

private static final MapID_CACHEDURL =new ConcurrentHashMap();

static void addURI_CACHEDURL(Map

uRI_CACHEDURL){

if(uRI_CACHEDURL !=null&& uRI_CACHEDURL.size()>0){ URI_CACHEDURL.putAll(uRI_CACHEDURL);

for(Map.Entry entry :

URI_CACHEDURL.entrySet()){

CachedUrl url = entry.getValue();

if(url !=null){

ID_CACHEDURL.put(url.getId(), url);

}

}

}

}

public static Set getCachedURISet(){

return URI_CACHEDURL.keySet();

}

public static CachedUrl getCachedUrlByURI(String uri){

CachedUrl result =null;

if(URI_CACHEDURL.containsKey(uri)){

result = URI_CACHEDURL.get(uri);

}else{

for(String tmp : URI_CACHEDURL.keySet()){

if(Pattern.matches(tmp, uri)){

result = URI_CACHEDURL.get(tmp);

if(result !=null){

break;

}

}

}

}

return result;

}

public static CachedUrl getCachedUrlByID(String id){ return ID_CACHEDURL.get(id);

}

static void setAdmin(ServletCacheAdministrator admins){

OSCacheStaticVariables.admin = admins;

}

static void setServletContext(ServletContext servletContext) {

OSCacheStaticVariables.servletContext = servletContext;

}

public static ServletCacheAdministrator getAdmin(){ return admin;

}

public static ServletContext getServletContext(){ return servletContext;

}

public static FilterConfig getConfig(){

return config;

}

public static Properties getOsCacheProps(){

return osCacheProps;

}

static void setOsCacheProps(Properties osCacheProps){

OSCacheStaticVariables.osCacheProps = osCacheProps;

}

static void setConfig(FilterConfig config){

OSCacheStaticVariables.config = config;

}

JspPageCacheFilter 主filter

package com.ttyc.sns.utils.cache;

import java.io.IOException;

import https://www.360docs.net/doc/e417129959.html,ng.reflect.Field;

import java.util.regex.Pattern;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.jsp.PageContext;

import org.apache.log4j.Logger;

import com.opensymphony.oscache.base.Cache;

import com.opensymphony.oscache.web.ServletCacheAdministrator; import com.opensymphony.oscache.web.filter.CacheFilter;

/**

*

* @author wupeng

*

*/

public class JspPageCacheFilter extends CacheFilter{

private static Logger logger =

Logger.getLogger(JspPageCacheFilter.class);

private boolean openCache =true;

@Override

public void init(FilterConfig filterConfig){

try{

//解析xml

OSCacheStaticVariables.addURI_CACHEDURL(CacheUrlParser.parseCa chedUrlFromXML

(Thread.currentThread().getContextClassLoader().getResourceAsS

tream("jspcache.xml")));

}catch(Exception e){

e.printStackTrace();

}

//缓存FilterConfig

OSCacheStaticVariables.setConfig(filterConfig);

openCache

=!"false".equals(filterConfig.getInitParameter("openCache"));

super.init(filterConfig);//父类初始化

try{

Class clazz = CacheFilter.class;

Field adminField = clazz.getDeclaredField("admin");

if(adminField !=null){

adminField.setAccessible(true);

Object obj =adminField.get(this);//获取到这个东西后面要用

OSCacheStaticVariables.setAdmin((ServletCacheAdministrator) obj);

}

}catch(Exception e){

e.printStackTrace();

logger.error(e);

}

//设置缓存更新策略

this.setExpiresRefreshPolicy(new

SnsPageEntryRefreshPolicy());

//设置组名提供策略

this.setCacheGroupsProvider(new

MyICacheGroupsProvider());

OSCacheStaticVariables.setServletContext(filterConfig.getServl etContext());

}

@Override

public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws ServletException,IOException {

if(openCache){

try{

HttpServletRequest httpRequest = (HttpServletRequest) request;

String realuri =this.getURI(httpRequest);

logger.debug("jspcachefilter processing uri : "+ realuri);

boolean matched =false;

if(OSCacheStaticVariables.getCachedURISet().contains(realuri)) {

matched =true;

}else{

for(String uri :

OSCacheStaticVariables.getCachedURISet()){

if(Pattern.matches(uri, realuri)){

logger.debug("matched key : "+ uri); matched =true;

break;

}

}

}

if(matched){

logger.debug(" this uri need to be cached, processing oscache filter : "+ realuri);

int scope = PageContext.APPLICATION_SCOPE;

CachedUrl url =

OSCacheStaticVariables.getCachedUrlByURI(realuri);

if(url !=null){

scope = url.getScope();

}

this.setCacheScope(scope);//设置缓存范围

super.doFilter(httpRequest, response,

chain);//走缓存的filter

}else{

chain.doFilter(request, response);

}

}catch(Exception e){

e.printStackTrace();

chain.doFilter(request, response);

}

}else{

chain.doFilter(request, response);

}

}

@Override

public void destroy(){

super.destroy();

}

private String getURI(HttpServletRequest httpRequest){

String uri = httpRequest.getRequestURI();

String realuri =null;

if(uri.indexOf("?")>0){

realuri = uri.substring(0, uri.indexOf("?"));

}else{

realuri = uri;

}

return realuri;

}

/**

* 自定义key的生成规则, 让key包含我们配置的id

* 生成key:[/前缀][/服务名]{([/key])|([/uri_method_][_md5(后缀)])}[后缀]

*/

@Override

public String createCacheKey(HttpServletRequest request, ServletCacheAdministrator scAdmin, Cache cache){

String uri =this.getURI(request);

CachedUrl url =

OSCacheStaticVariables.getCachedUrlByURI(uri);

String sufix =null;

if(url.getScope()== PageContext.SESSION_SCOPE){//如果是session有效的,那么这个key需要加上sessionID

sufix = request.getSession().getId();

}

String key = scAdmin.generateEntryKey(null, request, url.getScope(), url.getId()+"#", sufix);

logger.debug("generate oscache cache entry key : "+key);

return key;

}

SnsPageEntryRefreshPolicy缓存的刷新策略

package com.ttyc.sns.utils.cache;

import com.opensymphony.oscache.base.CacheEntry;

import com.opensymphony.oscache.base.EntryRefreshPolicy;

import com.opensymphony.oscache.base.NeedsRefreshException; import com.opensymphony.oscache.web.filter.ResponseContent;

public class SnsPageEntryRefreshPolicy implements EntryRefreshPolicy{

private static final long serialVersionUID = 6234071763160649441L;

/**

* Indicates whether the supplied CacheEntry needs to be refreshed.

* This will be called when retrieving an entry from the cache - if this method

* returns true then a

NeedsRefreshException will be

* thrown.

*

* @param entry The cache entry which is ignored.

* @return true if the content needs refreshing, false otherwise.

*

* @see NeedsRefreshException

* @see CacheEntry

*/

public boolean needsRefresh(CacheEntry entry){

long currentTimeMillis = System.currentTimeMillis();

long refreshPeriod =-1;

String uri = entry.getKey();

uri = uri.substring(1, uri.indexOf("#"));

CachedUrl cache =

OSCacheStaticVariables.getCachedUrlByID(uri);

if(cache !=null){

if(cache.isNeedRefresh()){//如果已经人为标记了需要更新,那么直接返回了,不判断时间了

}

refreshPeriod = cache.getExpiresInMillis();

}

if((refreshPeriod >=0)&&(currentTimeMillis >= (entry.getLastUpdate()+ refreshPeriod))){

return true;

}else if(entry.getContent()instanceof ResponseContent) {

ResponseContent responseContent =(ResponseContent) entry.getContent();

return currentTimeMillis >=

responseContent.getExpires();

}else{

return false;

}

}

}

return getGroupByURI(uri);

}

public static String[] getGroupByURI(String uri){

CachedUrl url =

OSCacheStaticVariables.getCachedUrlByURI(uri);

if(url !=null){

String group = url.getId();

return new String[]{group};

}

return null;

}

private String getURI(HttpServletRequest httpRequest){ String uri = httpRequest.getRequestURI();

String realuri =null;

if(uri.indexOf("?")>0){

realuri = uri.substring(0, uri.indexOf("?"));

}else{

realuri = uri;

}

return realuri;

}

}

public class OSCacheRefreshUtil {

/**

* 刷新缓存,自动判断刷新范围

* @param request

* @param group

*/

public static void refershCache(HttpServletRequest request, String[] groups){

ServletCacheAdministrator admin =

OSCacheStaticVariables.getAdmin();

ServletContext servletContext =

OSCacheStaticVariables.getServletContext();

if(groups !=null&& groups.length >0&& admin !=null){ for(String group : groups){

CachedUrl url =

OSCacheStaticVariables.getCachedUrlByID(group);

if(url !=null){

Cache cache =null;

if(url.getScope()==

PageContext.SESSION_SCOPE){

cache =

admin.getSessionScopeCache(request.getSession(true));

}else if(url.getScope()==

PageContext.APPLICATION_SCOPE && servletContext !=null){

cache =

admin.getAppScopeCache(servletContext);

}

if(cache !=null){

cache.flushGroup(group);

}

}

}

}

}

/**

* 刷新所有session缓存

* @param session

*/

public static void refreshAllSessionCache(HttpSession

session){

ServletCacheAdministrator admin =

OSCacheStaticVariables.getAdmin();

if(admin !=null){

Cache cache = admin.getSessionScopeCache(session);

if(cache !=null){

cache.flushAll(new Date());

}

}

// clearSessionCache(session);

}

@Deprecated

public static void clearSessionCache(HttpSession session){ ServletCacheAdministrator admin =

OSCacheStaticVariables.getAdmin();

if(admin !=null){

Cache cache = admin.getSessionScopeCache(session);

if(cache !=null){

Class clazz = cache.getClass();

try{

Method clearMethod = getMethod(clazz,"clear", null);

if(clearMethod !=null){

clearMethod.setAccessible(true);

clearMethod.invoke(cache,null);

}

}catch(SecurityException e){

e.printStackTrace();

}catch(IllegalArgumentException e){

e.printStackTrace();

}catch(IllegalAccessException e){

e.printStackTrace();

}catch(InvocationTargetException e){

e.printStackTrace();

}

}

}

}

public static Method getMethod(Class clazz, String methodName, Class...parameterTypes){

Method method =null;

try{

method = clazz.getDeclaredMethod(methodName, parameterTypes);

}catch(SecurityException e){

e.printStackTrace();

}catch(NoSuchMethodException e){

e.printStackTrace();

Class superClazz = clazz.getSuperclass();

if(superClazz !=null

&&!superClazz.getName().equals("https://www.360docs.net/doc/e417129959.html,ng.Object")){

method = getMethod(superClazz, methodName, parameterTypes);

}

}

return method;

}

/**

* 刷新session缓存

* @param gropus

* @param session

*/

public static void refreshSessionCacheByGroups(String[] groups, HttpSession session){

ServletCacheAdministrator admin =

OSCacheStaticVariables.getAdmin();

if(admin !=null){

Cache cache = admin.getSessionScopeCache(session);

refresh(groups, cache);

}

}

/**

* 刷新应用缓存

* @param groups

* @param context

*/

public static void refreshAppCacheByGroups(String[]groups){ ServletCacheAdministrator admin =

OSCacheStaticVariables.getAdmin();

ServletContext servletContext =

OSCacheStaticVariables.getServletContext();

SimpleStatisticListenerImpl 一个统计缓存命中率的东西要不要无所谓

/*

* Copyright (c) 2002-2007 by OpenSymphony

* All rights reserved.

*/

package com.ttyc.sns.utils.cache;

import https://www.360docs.net/doc/e417129959.html,mons.logging.Log;

import https://www.360docs.net/doc/e417129959.html,mons.logging.LogFactory;

import com.opensymphony.oscache.base.Cache;

import com.opensymphony.oscache.base.events.CacheEntryEvent; import

com.opensymphony.oscache.base.events.CacheEntryEventListener; import com.opensymphony.oscache.base.events.CacheGroupEvent; import

com.opensymphony.oscache.base.events.CacheMapAccessEvent; import

com.opensymphony.oscache.base.events.CacheMapAccessEventListen er;

import

com.opensymphony.oscache.base.events.CacheMapAccessEventType; import com.opensymphony.oscache.base.events.CachePatternEvent; import com.opensymphony.oscache.base.events.CachewideEvent; import com.opensymphony.oscache.base.events.ScopeEvent;

import

各类型网站-缓存解决方案

门户类随着互联网不断普及和飞速成长,门户网站已经成为网民获取信息的重要通道。每天大量网民点击访问,网站速度和网络稳定等方面面临着严峻挑战: 1、网站运维技术复杂 2、网站影响力大,对网络灾备要求高 3、网络服务众多,传输机制复杂 4、用户众多,分布广泛,网络情况复杂,响应速度要求高 5、易遭受攻击,网站安全性和稳定性要求高 某门户网站高标准规划、高起点建设,以新闻、信息、下载内容为主,文字、图片与视频、音频结合,目前拥有30 多个频道和子网站。随着自身的不断成长,网站也面临了性能和可用性方面的问题和挑战: 一旦IDC 内的服务器停止工作或ISP 服务中断,如何保证网站始终在线?必须通过更快的响应速度来满足客户的需求,如何为客户提供最及时的响应?应用服务器由于服务器硬件的稳定性、流量压力超载、网络攻击等情况,经常会意外宕机,如何保证网络应用的7 ×24 小时持续性服务? 为解决以上问题,该门户网站使用了PowerCDN服务,确保了关键任务应用的快速、安全和容错性运行。无论该网站的客户所处全球位置如何,PowerCDN的Smart DNS都可将他们引导到具有最佳性能的可用PowerCDN节点,页面响应速度明显提升;同时源站隐藏在CDN节点后,大大减少来自互联网上的直接安全威胁;遇到热点事件的突发流量也不必为此单独购置专门的设备。 sns社区类随着越来越多的个人用户参与到互联网内容的管理、维护、存储、上传、分发等价值链条中,互联网逐渐转变成一个分散存储、读与写并存的多中心交互式平台,社会网络(sns)作为Web2.0的典型应用之一更是遍地开花。由于内容的生产者和组织者越来越多和越来越分散,内容的多节点上传几乎与自上而下的下发变得一样普遍,于是本已拥塞不堪的网络带宽更显拥挤,在现有带宽条件下,如何提高网站接入速度和响应速度,进而改善用户体验,真正做到以用户为中心?这是所有sns社区类网站都必须面对并给出满意解答的一道课题。 1、网站交互性超强 2、文件种类和数量多而且复杂 3、安全保密性要求高

PHP开发常用的五种缓存技术

1、全页面静态化缓存 也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系统中比较常见,比如dedecms; 一种比较常用的实现方式是用输出缓存: Ob_start() ******要运行的代码******* $content = Ob_get_contents(); ****将缓存内容写入html文件***** Ob_end_clean(); 2、页面部分缓存 该种方式,是将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示;可以使用类似于ob_get_contents的方式实现,也可以利用类似ESI之类的页面片段缓存策略,使其用来做动态页面中相对静态的片段部分的缓存(ESI技术,请baidu,此处不详讲)。该种方式可以用于如商城中的商品页; 3、数据缓存 顾名思义,就是缓存数据的一种方式;比如,商城中的某个商品信息,当用商品id去请求时,就会得出包括店铺信息、商品信息等数据,此时就可以将这些数据缓存到一个php 文件中,文件名包含商品id来建一个唯一标示;下一次有人想查看这个商品时,首先就直接调这个文件里面的信息,而不用再去数据库查询;其实缓存文件中缓存的就是一个php数组之类; 4、查询缓存 其实这跟数据缓存是一个思路,就是根据查询语句来缓存;将查询得到的数据缓存在一个文件中,下次遇到相同的查询时,就直接先从这个文件里面调数据,不会再去查数据库;但此处的缓存文件名可能就需要以查询语句为基点来建立唯一标示; 5、按内容变更进行缓存 这个也并非独立的缓存技术,需结合着用;就是当数据库内容被修改时,即刻更新缓存文件; 比如,一个人流量很大的商城,商品很多,商品表必然比较大,这表的压力也比较重;我们就可以对商品显示页进行页面缓存;当商家在后台修改这个商品的信息时,点击保存,

HTML清除浏览器缓存

JSP页面缓存技术浏览器缓存 一、概述 缓存的思想可以应用在软件分层的各个层面。它是一种内部机制,对外界而言,是不可感知的。 数据库本身有缓存,持久层也可以缓存。(比如:hibernate,还分1级和2级缓存)业务层也可以有缓存(但一般来说,这是一个过程域,不会设缓存)。 表现层/数据服务层(传统web的表现层)也可以设置缓存(jsp cache 就是这一层,实现在app server上的缓存机制) 另外Browser也有缓存(如IE)这个大家也都知道(实现在web server 上的缓存机制)。越上层的缓存效果越好,越底层的缓存影响越深远。 二、缓存实现(浏览器缓存当前访问的JSP动态页面) (一)、服务端方法: <% response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", -10); %> (二)、客户端方法: meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head>中,meta 标签的用处很多。meta 的属性有两种:name和http-equiv。name 属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是description(站点在搜索引擎上的描述)和keywords(分类关键词),所以应该给每页加一个meta值。比较常用的有以下几个: name 属性 1、<meta name="Generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等; 2、<meta name="KEYWords" contect="">向搜索引擎说明你的网页的关键词; 3、<meta name="DEscription" contect="">告诉搜索引擎你的站点的主要内容; 4、<meta name="Author" contect="你的姓名">告诉搜索引擎你的站点的制作的作者; 5、<meta name="Robots" contect="all|none|index|noindex|follow|nofollow"> 其中的属性说明如下: 设定为all:文件将被检索,且页面上的链接可以被查询; 设定为none:文件将不被检索,且页面上的链接不可以被查询; 设定为index:文件将被检索; 设定为follow:页面上的链接可以被查询; 设定为noindex:文件将不被检索,但页面上的链接可以被查询; 设定为nofollow:文件将不被检索,页面上的链接可以被查询。 http-equiv属性 1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80"> 和<meta http-equiv="Content-Language" contect="zh-CN">用以说明主页制作所使用的文字以及语言;又如英文是ISO-8859-1字符集,还有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集; 2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定时让网页在指定的时间n

减震缓冲技术

减震缓冲技术发展综述 姓名:尚兴超 学号:511011503 指导老师:梁医 一.概述 机械振动、冲击问题广泛存在于工程机械[1]、汽车机械、建筑机械、船舶机械、航空航天、武器领域[2]等,减振器和缓冲器主要是用于减小或削弱振动或冲击对设备与人员影响的一个部件。它起到衰减和吸收振动的作用。使得某些设备及人员免受不良振动的影响,起到保护设备及人员正常工作与安全的作用,因此它广泛应用于各种机床、汽车、摩托车、火车、轮船、飞机及坦克等装备上。 振动问题的基本方程为: ()e sin n t d x A t ζωωφ-=+ 从方程中可以看出,系统振动幅值的衰减与阻尼系数大小ζ有关[3],也就是说,震动产生的能量将会被阻尼所吸收。减震器和缓冲器就是基于此原理而设计的。 二.发展历史 世界上第一个有记载、比较简单的减震器是1897年由两个姓吉明的人发明的。他们把橡胶块与叶片弹簧的端部相连,当悬架被完全压缩时,橡胶减震块就碰到连接在汽车大梁上的一个螺栓, 产生止动。1898年,第一个实用的减震器 由一个法国人特鲁芬特研制成功并被安装到摩托赛车上。他将前叉悬置于弹簧上,同时与一个摩擦阻尼件相连,以防止摩托车的振颤。1899年,美国汽车爱好者爱德华特·哈德福特将前者应用于汽车上。后来,又经历了加布里埃尔减震器、平衡弹簧式减震器和1909年发明的空气弹簧减震器。空气弹簧减震器类似于充气轮胎的工作原理,它的主要缺点是常常产生漏气。 1908年法国人霍迪立设计了第一个实用的液压减震器。其原理是液流通过小孔时产生的阻尼现象。20世纪60年代,通用公司麦迪逊工程师研制了把螺旋弹簧、液压减震器和上悬架臂杆组成的麦迪逊减震器,其体积比较小,得到了广泛的应用[4]。 三.研究现状 液压缓冲器是目前应用最为广泛的减震缓冲装置,其结构简单,运行平稳。

操作系统习题及答案五

习题五设备管理 一、单项选择题 1、在操作系统中,用户在使用I/O设备时,通常采用()。 A.物理设备名 B.逻辑设备名 C.虚拟设备名 D.设备牌号 2、操作系统中采用缓冲技术的目的是为了增强系统()的能力。 A.串行操作 B. 控制操作 C.重执操作 D.并行操作 3、操作系统采用缓冲技术,能够减少对CPU的()次数,从而提高资源的利用率。 A. 中断 B.访问 C. 控制 D. 依赖 4、CPU输出数据的速度远远高于打印机的打印速度,为了解决这一矛盾,可采用()。 A.并行技术 B.通道技术 C.缓冲技术 D.虚存技术 5、引入缓冲技术是为了(). A.提高设备利用率 B.提高内存接口 C.扩充相对地址空间 D.提高CPU和I/O设备之间交换信息的速度 6、通道是一种()。 A.I/O端口 B.数据通道 C.I/O专用处理机 D.软件工具 7、设备管理的主要程序之一是设备分配程序,当进程请求在内存和外设之间传送信息时, 设备分配程序分配设备的过程通常是()。 A、先分配设备,再分配控制器,最后分配通道 B、先分配控制器,再分配设备,最后分配通道 C、先分配通道,再分配设备,最后分配控制器 D、先分配通道,再分配控制器,最后分配设备 8、下列描述中,不是设备管理的功能的是()。 A.实现外围设备的分配与回收B.缓冲管理与地址转换 C.实现按名存取D.实现I/O操作 9、用户编制的程序与实际使用的物理设备无关是由()功能实现的。 A.设备分配B.设备驱动C.虚拟设备D.设备独立性 10、SPOOLing技术利用于()。 A.外设概念 B.虚拟设备概念 C.磁带概念 D.存储概念 11、通过硬件和软件的功能扩充,把原来独立的设备改造成能为若干用户共享的设备,这种 设备称为()。 A.存储设备B.系统设备 C.用户设备D.虚拟设备 12、采用SPOOLing技术的目的是()。 A、提高外设和主机的利用率 B、提高内存和主机效率 C、减轻用户编程负担 D、提高程序的运行速度 13、假脱机技术一般不适用于()。 A、分时系统 B、多道批处理系统 C、网络操作系统 D、多处理机系统

网页视频下载方式大全

网页音视频下载方式大全(编辑完成) 优酷、奇艺、搜狐等网站上有不少好看的、有用的、喜欢的视频,但下载却提示要安装客户端,而绝大多数人都不会只呆在一家视频网站上,要都安装客户端,未免太过麻烦,而且很多时候也基本用不到。那么有没有办法直接下载网页视频?答案是肯定的。 目前,我们可以通过插件、软件、网站和浏览器来下载网页视频。这些东西使用的方式主要有两类:一是从浏览器缓存中提取视频缓存;二是通过分析网页元素等方式查找网页视频的下载地址。下面我就将通过插件下载、软件下载、浏览器下载来介绍网页音视频的下载方式。 一、通过插件来下载网页中的音视频 1、火狐插件 说到通过插件下载网页中的音视频,最有名的果断是火狐上的NetVideoHunter Video Downloader。这款插件目前只开发了火狐版,该插件支持火狐3.0以后的 所有版本。它能从火狐的缓存中提取视频,能够从几乎任何网站上提取视频、音频的下载链接并下载,能在独立窗口中播放音视频,并且,即使是优酷之类的将长视频分段保存的网站,它也能嗅探到所有的视频片段,不会像某些工具只能嗅探到部分。 当页面有音视频时,火狐右下角NetVideoHunter的图标上就会显示网页中包含的音视频数量,点击弹出下载和独立播放窗口。下图为截图:

此外火狐上还有FlashGot、Easy YouTube Video Downloader等优秀插件也能 嗅探到网页中的音视频。 2、chrome及基于chromium开发的浏览器上的插件 作为浏览器市场上的有力竞争者,chrome上也有视频提取的插件:FVD Video Download,它同样能够嗅探到几乎所有网站上的音视频,包括优酷等分段存储 加载的音视频,并调用浏览器自带下载来下载音视频(调用迅雷旋风等需要浏览器或其他插件支持)。 当嗅探到页面上有音视频时,FVD Video Download在插件栏上的图标会变为蓝色的箭头(不然为带红×的灰色箭头),点击即可下载。下图是截图:

网站性能优化:页面静态化和二级缓存

网站性能优化:页面静态化和二级缓存 2009-08-29 23:41:20| 分类:java | 标签:无|字号大中小订阅 性能方案: 1.页面静态化。只适合那些不会经常发生变化的页面(不适合条件查询和分页)。 对于经常发生变化的内容,如何进行性能优化 2.缓存方案。 1.页面缓存(性能高与二级缓存) 2.业务层缓存(二级缓存,只缓存对象),hibernate二级缓存 页面缓存 1.页面缓存缓存的是servlet向页面输出的html代码,我们使用OsCahe作为页面缓存产品。OsCahe也可以用作二级缓存。 什么是OSCache OSCache标记库由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能。OSCache是个一个广泛采用的高性能的J2EE 缓存框架,OSCache能用于任何Java应用程序的普通的缓存解决方案。OSCache有以下特点:缓存任何对象,你可以不受限制的缓存部分jsp页面或HTTP请求,任何java对象都可以缓存。拥有全面的API--OSCache API给你全面的程序来控制所有的OSCache特性。永久缓存--缓存能随意的写入硬盘,因此允许昂贵的创建(expensive-to-create)数据来保持缓存,甚至能让应用重启。支持集群--集群缓存数据能被单个的进行参数配置,不需要修改代码。缓存记录的过期--你可以有最大限度的控制缓存对象的过期,包括可插入式的刷新策略(如果默认性能不需要时)。 使用OsCahe如何实现页面全局和局部缓存。 只需要学习几个标签 采用map结构的对象缓存内容,这个缓存的key就是我们请求的路径。以后只要我们访问相同的路径,就可以在map中找到这个缓存的内容。但是如果我们在路径后面加上参数,map 中就找不到了。缓存就不会被使用了。 所以我们可以自己指定缓存的key的名称。 scope可以定义这个缓存的使用范围,session只对同一个会话进行缓存 time指定缓存时间,默认是1个小时。过时以后,旧缓存会丢失,重新建立新的缓存。 refresh:强行清除缓存。里面可以接收el表达式,true表示重新建立缓存。默认为false。 下面是一些示例 我们使用Oscache的标签来进行页面的局部缓存.使用方法如下: <%@taglib uri="https://www.360docs.net/doc/e417129959.html,/oscache" prefix="cache"%>

缓存技术

一、缓存技术 缓存技术是一种在本地存储经常访问的信息的一种技术。Web缓存在用户本地的存储设备上存储Web网页及其内容,这要比Web查询快。通过减少WAN链路和Web服务器上的传输量,缓存为ISP、企业网络及终端用户提供了以下一些好处。 1、减少WAN带宽的占用,降低成本。ISP把缓存引擎(Cache Engine)置于网络关 键点上,以提高响应时间,降低骨干网上的带宽占用需求。ISP也把缓引擎置于W AN 访问的关键点上,使其能从本地磁盘上为Web查询提供服务,而不能远距离或通过Web服务器读取信息。 在企业网中,由于Web缓存技术可以用低成本、低带宽的W AN链路服务同一个位置的用户群,从而大大降低了对带宽的占用时间。企业可以利用现有的WAN链路带宽增加用户数,并为用户提供更多的服务。 2、提高终端用户的效率。本地Web缓存的响应时间比WAN下载相同内容的时间快 三倍,终端用户可明显感到响应时间的加快,并可实现完整的传输。 3、安全访问控制及监测。缓存引擎为网络管理员提供了一个简单、安全的方法,通 过URL过滤机制,可加强基于站点地址的访问控制策略。 4、可操作日志记录。网络管理员能了解哪些URL被点击、每秒缓存服务多少个查询、 从缓存提取的URL的百分比是多少以及其它操作相关的统计数据。 Web缓存按以下步骤工作:1、用户访问Web网页;2、当网页传输给用户时,缓存系统存储网页并把与其相关的图文存储到本地存储设备上;3、另一个用户(或初始用户)访问此网页;4、Web缓存从本地存储器中取出网页,而不用在Internet上发送查询信息,这样就加快了下载速度,减少了W AN链路的带宽需求;5、不同的系统对保证缓存信息与源信息同步更新的方法各不相同。 IP缓存加快网络访问速度 I P超高速缓存(I P C a c h i n g)已经成为优化使用 带宽和提高网络性能的一种良好的解决方案。对最终用 户的近端所需文件频繁存储,可以降低相应的W A N或 I n t e r n e t连接的带宽需要,这样反过来又省去了或延 缓了昂贵的升级之需。因为所有通信都是以L A N的速度 传输,这同样提高了最终用户的性能。 这种缓存技术减少了W A N的数据链接流量,减轻了W e b服务器的负担,它给I S P、企业网与最终用户都带 来了显而易见的好处。 1.减小W A N的带宽从而降低了网络开销; 2.提高最终用户的效率。采用了I P缓存技术的网络,从缓存服务器中下载的回应速度要比从W A N上下载 同样的内容快3倍。

教你如何提取网页中的视频、音乐歌曲、

教你如何提取网页中的视频、音乐歌曲、flash、图片等多媒体文件(很实用) 打开网页后,发现里面有好看的视频、好听的音乐、好看的图片、很炫的flash,是不是想把它们弄到自己电脑上或手机、mp4上?但很多时候视频无法下载,音乐只能试听,或者好听的背景音乐根本就不知道什么名字,更别说怎么下了;至于图片直接右键另存为即可,不过如果网页突然关掉了,但又想把看过的图片弄下来,而忘了图片网页地址或者不想再通过历史记录打开,这时又该怎么办? 其实这些问题都能很好的解决,并且很简单,只要用一个软件 来替你从电脑的缓存中搜索一下就OK了,因为网页中显示的内容基本 上全部都在缓存中,如果自己手动搜索,那将是很累人滴,又不好找,东西太多,又没分类。 无意中发现一个小软件很强(对此感兴趣,本人玩过无数小软件),我一直在用,也是用它帮了很多网友的忙,为了让更多的网友解决问题,于是拿来和亲们分享一下。不废话了,下面进入主题: 这款免费小软件就是YuanBox(元宝箱)v1.6,百度一搜就能下载。 下面是我自己整理的使用步骤,供亲们参考(其实不用看就行,软件简单,不用学就会),我只是用的时间长了,很熟练罢了: 软件下好后,解压,打开里面的YuanBox.exe即可,不用安装;打开此软件前,先打开你要提取东西的网页(之后再关掉也行),这是为了保证电脑缓存中有你要的东西。 运行软件,初始界面如下图:

之后直接是flv格式视频搜索结果的界面,原因就是此软件的全称是 元宝箱FLV视频下载专家,不想要视频的话,点击最上面的设置或者最下面的高级设置,即可进行搜索范围设定

下面是搜索条件设定界面 以swf格式flash为例,进行搜索,选择类型中的第二项 点击确定,开始搜索,结果如下:

分布式缓存技术方案

一、背景 在高并发的分布式的系统中,缓存是必不可少的一部分。没有缓存对系统的加速和阻挡大量的请求直接落到系统的底层,系统是很难撑住高并发的冲击,分布式系统中缓存的设计是很重要的一环 使用缓存的收益: ●加速读写,缓存一般是内存操作,要比传统数据库操作要快的多 ●降低后端的负载。缓存一些复杂计算或者耗时得出的结果可以降低后端系统对CPU、 IO、线程这些资源的需求 ●本地缓存远端调用结果,减少服务间的调用,提升服务并发能力 目前问题: ●目前业务中对缓存的使用并不多,在这次直播活动中,组件性能瓶劲很多,有很大一 部分是可以通过缓存加速的 ●疫情直播活动期间,几个核心服务由于人手、改造难度问题等,最后由罗陈珑做一了 个缓存代理服务,把UC、EOMS的部分接口做了缓存代理,这些缓存本来应該由服务提供者来实现的 ●数据一致性问题,加了缓存之后,随之而来的就是数据一致性的问题,发现有数据不 能及时更新 ●目前大家对缓存使用方式不太统一,有的组件使用本地JVM缓存时封装太复杂,出现 问题不好定位,清除缓存也不好做 二、目标 ●降低分布式缓存技术使用门槛,将分布式缓存框架作为微服务开发必备的脚手架,让

开发者更易使用,避免因技术门槛而放弃使用缓存 梳理核心业务,使用分布式缓存加速服务响应速度,降低服务负载 三、分布式缓存方案 3.1 @WafCacheable 缓存 3.1.1 分布式缓存和本地jvm缓存 为了提高接口能力,需要将一些频繁访问但数据更新频率比较低的放入缓存中,不要每次从数据库或其他耗时耗资源的数据源中取。使用@WafCacheable 注解,缓存过期时间可以根据数据更新频率自由设定,不设置默认为2小时。 @WafCacheable 标记的方法被拦截后,数据获取的优先级:本地jvm缓存>redis缓存> 数据源(DB、RMI、其他耗时耗资源的操作) @WafCacheable 使用场景:高频访问低频更新的数据 注意:@WafCacheable 对同一个类里的内调方法(A调B, B上加注解不生效),如果直接用this.B(),加在B上的缓存不生效,需要使用${service}.B()调用(${service}指service实例)。 3.1.2 RMI缓存 RMI(Remote Method Invocation)是指微服务提供的SDK中FeignClient方式申请的接

下载网页视频方法

微博上看到的视频下载到电脑上的方法 分步阅读 我们刷微博时经常会看到网友发表视频,看到一些很棒的视频你是不是想下载到电脑上呢?网上可以找到很多所谓的教程,适用范围都不普遍。现在分类介绍下载那些视频的方法。 工具/原料 ?浏览器(建议使用IE) ?迅雷 ?部分视频网站的专用下载工具(如优酷、土豆) 第一类:有专用下载器的(如优酷、土豆) 1. 1 首先,下载视频的第一步就是进入原网页。在微博上就能找到(红框所示)。 每一条分享视频的微博都会有一个这样的图标,点它就能进入原网页。 2. 2 进入了原网页,接下来就是用那些下载器来下载了。第一类是比较简单的。 END 第二类:美拍视频 1. 1

由美图秀秀推出的“美拍”应用如今越来越受欢迎,使用人数也很多。美拍的视频在电脑上可以用迅雷来下载。第一步依然是进入原网页。 2. 2 进入原网页后,在网页内空白处右击鼠标,选择“查看源代码”。 3. 3 在源代码界面里你会看到一个“http://…….mp4”的地址,如果找不到,可以按组合键Ctrl+F打开查找功能,输入“.mp4”查找。找到这个地址后复制它,这时如果你的迅雷已经打开,就会自动弹出建立新任务的提示。这样就能把美拍的视频下载好了。美拍这一类视频的网页在源代码中有完整视频地址,下载相对也比较方便。 END 第三类:只能找缓存文件的(如秒拍、微博视频) 1. 1 秒拍似乎已经过气了,“微博视频”也是现在手机微博的功能,经常被使用。这两种视频是以Flash的形式播放的,地址在源代码里找不到。很多网友都说可以在缓存文件里找到,但如今的主流浏览器(如360、百度)为了减少内存占用量,是不保存大部分视频的缓存文件的,实践证明用360看过这两种视频后,缓存文件里根本找不到对应文件。因此假如你对这个视频有比较执着的喜爱,那就麻烦一下找IE浏览器帮忙吧。 2. 2

双缓冲技术

双缓冲技术及其在VC的GDI环境下的实现 作者:HateMath的网上田园出处:VCKBASE 责任编辑:方舟 昨天在论坛上,有人问起双缓冲的实现问题,想起网上这方面资料比较凌乱,而 且多是 DirectX 相关的,今天特地在这里给大家简要的介绍一下双缓冲技术及其在 VC++ 的 GDI 绘图环境下的实现。 1、Windows 绘图原理 我们在 Windows 环境下看到各种元素,如菜单、按钮、窗口、图像,从根本上说,都是“画”出来的。这时的屏幕,就相当于一块黑板,而 Windows 下的各种 GDI 要素,如画笔、画刷等,就相当于彩色粉笔了。我们在黑板上手工画图时,是一笔一划的,电脑亦然。只不过电脑的速度比手工快的太多,所以在我们看起来好像所有的图 形文字都是同时出现的。 2、普通绘图方式的局限 上述绘图方式我们暂且称之为普通绘图方式吧。虽然这种方式能满足相当一部分 的绘图需要,但是当要绘制的对象太复杂,尤其是含有位图时,电脑便力不从心了。 这时的画面会显示的很慢,对于运动的画面,会给人“卡”住了的感觉,总之一个字:不爽。 3、解决之道:双缓冲 双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存 环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘 制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。下面是原理图:

图一双缓冲原理示意图 4、相关的函数介绍 1)、为屏幕 DC 创建兼容的内存 DC:CreateCompatibleDC() if(!m_dcMemory.CreateCompatibleDC(NULL)) // CDC m_dcMemory; { ::PostQuitMessage(0); } 2)、创建位图:CreateCompatibleBitmap() m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height()); // CBitmap m_Bmp; 3)、把位图选入设备环境:SelectObject(),可以理解为选择画布 ::SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp); 4)、把绘制好的图形“拷贝“到屏幕上:BitBlt()

页面缓存

页面缓存 1前言 页面缓存一直是前端开发中我们关注比较少的,研究了一些资料,总结了一些心得,记录下来共同探讨。 合理的页面缓存可以让页面执行的效率提高很多(在第一次访问或者CTRL+F5强制刷新的时候,缓存的效果是体现不出来的),而不是我们一味的设置cache-control为no-cache。 当然了如果缓存使用不当,也会带来麻烦,比如缓存参数设置不合理,会导致请求得到的是旧的页面元素。 2缓存原理 首先一开始我们要明确页面缓存的原理以及过程。 缓存的原理大体是在浏览器对资源的第一次请求之后,把资源中的一部分存储在计算机的临时文件空间,再次请求的时候,按照特定的策略加载缓存的资源,减少HTTP请求次数与传输数据量,以此提高浏览效率。 以下是一个请求的过程讲解。 2.1 第一次请求 打开一个浏览器如IE,这时候浏览器会对自身设置的参数进行加载,其中就包括缓存设置参数。 接下来我们在地址栏输入一个url,这时候浏览器会发送一个简单的HTTP请求报文头给应用服务器,这个报文头主要包含的信息是请求的url,接受的编码约定,缓存控制等信息。 典型的请求报文头:

服务器接受到了请求报文头,一堆业务处理完毕之后,会给出HTTP响应报文,响应报文格式分为报文头和报文体,响应报文头中的信息是很重要的,我们以一个图片响应报文头为例讲解相关内容: 这个响应报文头可以看到以下信息: 响应状态码是200,说明是正确返回。 cache-control设定了有效时间,在这个时间内新打开新网页(或者地址栏回车)不 需要去请求服务器。 报文内容类型是image/gif。 最近修改时间是2008-7-30 10:23:00,最近修改时间在浏览器刷新的时候有很大的 用处,浏览器刷新的时候,会发送对该图片请求的报文,得到的响应报文中如果最 近修改时间和缓存的一致,那么浏览器将会从缓存中读取该图片的信息(状态码是 304),如果两个时间不一致,会从服务器请求得到最新的文件,并缓存。 服务器类型等其他信息。 该响应报文接受到之后,浏览器解读报文体内容,并打开显示给用户,这是主要的工作。 除此之外,浏览器还根据报文头的信息,确定一些缓存规则,比如no-cache的不缓存,设置了max-age的再次打开不请求等,更多的信息可以参考三、四章节。 2.2 再次请求 再次请求的时候,才是缓存显现身手的时候。 还是以上面请求的那个图片(设置了max-age)为例。

设置静态内容缓存时间(百度优化建议)

通过百度优化建议检测网站,出现设置静态内容缓存时间这一项。有很多页面,比如FAILED - (未设置max-age或expires) –https://www.360docs.net/doc/e417129959.html,/提示“变化很少的静态资源可以设置客户端缓存时间,减少请求”,这个怎么设置呢? 我们的网站中往往包含大量的页面组件,比如图片、样式表文件、JS脚本文件和Flash动画。这些组件的变化频率非常低,尤其是那些构成网站基本框架的组件,几乎不会发生变化。我们可以将这些变化率很低的组件看作静态内容,并且通过max-age或expires标识设置缓存过期的时间,以便下次更快的访问,节约带宽资源,节省服务器资源、提高用户体验等。 apache配置: ExpiresActive On ExpiresByType image/gif A2592000 ExpiresByType image/jpeg A2592000 ExpiresByType image/png A2592000 ExpiresByType image/x-icon A2592000 ExpiresByType application/x-javascript A604800 ExpiresByType text/css A604800 或者 ExpiresActive on ExpiresDefault "access plus 600 minutes" 可以选用的时间参数有years months weeks days hours minutes seconds 也可以加在.htaccess文件: #Expire Header ExpiresDefault "access plus 2 hours" or # Expire images header ExpiresActive On ExpiresDefault A0 ExpiresByType image/gif A2592000 ExpiresByType image/png A2592000 ExpiresByType image/jpg A2592000 ExpiresByType image/jpeg A2592000

如何清理浏览器缓存

如何清理浏览器缓存 一、为什么要清理浏览器缓存; 因为客户管理系统与资源管理系统统一采用的是EXTJS富客户端的开发技术,这种技术的好处是一次加载以后会在浏览器中保存一个缓存文件,当下次再次登陆系统的时候就无需再次向服务器进行页面文件请求。这样就能很大的提高相应速度和减少服务器压力。但是任何技术都不是完美的,EXTJS也存在天然的制约性,就是当页面已经更新的时候需要手动清理缓存,重新将新的内容缓存到浏览器。 二、如何清理缓存; 2.1谷歌(Google)浏览器: 2.1.1清除当前页面缓存: 在当前页面空白处,鼠标右键选择“重新加载框架”。如图一所示:

(图一) 2.1.2清除浏览器全部缓存: 1)在浏览器的右上角先单击“自定义及控制”按钮,在弹出来的菜单中选 择“历史记录(H)”或者直接快捷键“Crtl+H”; 2)在弹出来的页面中选择“清除浏览数据...”; 3)在弹出的新窗体中选择“清除浏览数据”按钮,清理浏览器的缓存;如 图二、三、四所示。

(图二) (图三)

(图四) 2.2火狐(FireFox)浏览器; 2.2.1清除当前页面缓存: 在当前页面空白处,鼠标右键选择“此框架(H)”。然后选择“重新加载框架(R)”,如图五所示:

(图五) 2.2.2清除浏览器全部缓存: 1)在浏览器左上角点击“FireFox”按钮; 2)在弹出来的菜单中选择“历史”; 3)选择“清除最近的历史记录....”; 4)选择“立即清除”。如图六、图七所示。

(图六) (图七) 2.3IE(Internet Explorer)浏览器; 2.3.1清除当前页面缓存: 在页面的空白位置,使用鼠标右键,在弹出来的菜单中选择“刷新”;

三种网页视频下载方法介绍

三种网页视频下载方法介绍 如何将网页上的视频下载是常遇到的问题,常规做法是注册网页所属的视频网站后再用其专属播放插件下载。视频网站众多,这就要安装繁多播放插件,另外记忆众多的户名和密码也顶麻烦,况且不少网站就没有视频下载界面。为此将本人最近常用的三种视频下载方法和软件介绍给大家,以供参考。 一、不用软件工具下载方法: 1、下载前打开网页的【工具】、【Internet选项】、点【删除文件】、【确定】,清空多余的缓存文件。 2、当网页视频播看快到结束,只要进度条走满就应刻暂仃(因为播完后播放软件有可能会自动清除缓存文件)。 3、再打开【Internet选项】、【设置、【查看文件】,这时打开了一个文件夹:c:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files(当然也可直接打开这个文件夹),为了方便查找缓存文件夹中视频文件,应按大小排列一次文件,一般视频文件就比较大,大部分都是FLV (或者试改为后缀名为:flv),找到视频文件后将其复制到指定文件夹,用暴风影音或者其它播放软件打开核对确认。 4、一般来说缓冲文件夹中视频文件大多是几个小段,尚需用软件合并方好连续播看。 不过,这种方法虽简单但实际上效果不是太好,因为大多播放软件的临时缓存文件视频存放文件夹都不一定在上述文件夹(c:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files)内。 这时可用下面介绍的两个软件下载。 二、使用维棠FLV视频下载软件下载: 1、打开维棠FLV视频下载软件 2、打开视频所在网页 3、复制视频所在网页的地址(用鼠标拉黑后按Ctrl+ C) 4、点开维棠FLV视频下载软件菜单【文件】【新建】后出如下图的【[添

利用IE缓存下载网页中的动画和视频

利用IE缓存下载网页中的动画和视频 经常有同事和朋友叫我帮忙下载网页中的动画或视频等资源,其实我们可以利用IE缓存来找到这些资源。为了提高访问网页的速度,Internet Explorer浏览器会采用累积式加速的方法,将你曾经访问的网页内容(包括图片、flash动画、flv视频以及cookie文件等)存放在电脑里。这个存放空间,我们就称它为IE缓存。以后我们每次访问网站时,IE会首先搜索这个目录,如果其中已经有访问过的内容,那IE就不必从网上下载,而直接从缓存中调出来,从而提高了访问网站的速度。这就是为什么第一次打开一个网站时比较慢,第二次打开却快很多的原因。 也就是说,其实我们打开网页时,那些资源已经存储到我们的电脑缓存空间里了,根本不用下载,只要找到它们,复制出来就行了。那如何找到这些资源呢?我把自己 的经验总结一下,希望以后有需要的朋友不用再找我了 一、打开IE的缓存文件夹。打开IE(最好用IE,因为IE是我测试过无数次的了,其他浏览器的缓存文件夹比较难找,我也没有测试过。),依次单击“工具”>“Internet 选项”,然后在“Internet选项”对话框的“常规”选项下依次单击“设置”>“查看文件”,就能打开IE的缓存目录了。当然其实这个目录可以自己指定的,如果指定了,就更容易找。操作步骤如下图:

二、这个缓存目录里的文件非常多,为了方便查找可以先依次单击“编辑”>“全部选定”选中全部文件,然后把文件删除,这时可能会提示你是否删除选定的cookie,直接单击“是”就行了,删除这些cookie文件对电脑也不会有影响。如果Win7系统在这一步没有“编辑”菜单,可先单击任意一个文件,再同时按“Ctrl”和“A”两 个键也能选中全部文件。如下图:

搭建web缓存服务器

一、说明 随着网站访问量的不断攀升,网站的负荷也不断上升,数据库负荷变化尤其明显,特别是在访问的高峰期,用户浏览器页面显示很缓慢,长时间连一个文本页面都显示不出来,最差的情况是网站直接崩溃,严重的影响了用户的体验,降低了网站的粘性。这个时候,是一定要考虑搭建web缓存服务器的时候了。 我们选择的是一款Fikker 网站加速产品作为参考示例。根据官方的介绍,Fikker 是一款完全基于高速内存的缓存加速产品,无缓存文件生成,支持跨平台(windows和linux),在V3.2.4 之前还没有看到提供对freeBSD 操作系统的支持,我们使用它的免费版本做为示例。搭建web缓存服务器的目的:除了降低网站服务器的负荷和加快页面显示外,还可以隐藏源站,进行流量统计和实时监控,甚至是防盗链等等,最重要的是整个过程不需要修改已有网站程序的源码,全界面化的web缓存配置操作。 二、准备阶段 这个阶段我们先到Fikker 的官方网站下载它,我们下载和使用的是CentOS Linux 版本,不管是Linux 还是Windows 版本,整个安装和配置过程非常类似。我们将下载后的安装包fikkerd-3.2.4-linux-x86.tar.gz 放在/home/meng 下面,通过命令行进行解压: tar zxvf fikkerd-3.2.4-linux-x86.tar.gz 三、配置阶段 1、根据Fikker 安装说明,到了这个阶段,我们可以进行相关的配置了,目前Apache 已经在占用80 端口,为了安全起见,我们先测试后实施,我们现将Fikker 的默认端口80 改成8080,这样子我们就可先将Fikker 配置和测试完成后,再让其投入实际服务当中去,不会对原有的网站有任何影响。首先修改config 目录下面的fikkerd.ini 配置文件(命令行为:vi fikkerd.ini),如下:

几种清除页面缓存的方法

在https://www.360docs.net/doc/e417129959.html,中使用模式dialog时,你会发现每次打开的页面都是相同的内容,页面内容并没有刷新,这是缓存的原因造成的, 解决方法如下: 第一种是https://www.360docs.net/doc/e417129959.html,清除页面缓存 Response.Buffer = true; Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1); Response.Expires = 0; Response.CacheControl = "no-cache"; Response.AddHeader("Pragma", "No-Cache"); 第二种是HTML方法 第三种是重新调用原页面的时候在给页面传一个参数: href="****.ASPX?random()" 最后一种是在在页面中禁用缓存 在web开发中合理使用缓存可以有效的提高网站的性能,但是在某些场合下因为缓存的存在会带来很多的问题。 例如:因为缓存的存在会造成重复提交数据的问题,验证码图片不能正确显示的问题,等等。这个时候我们就要禁用页面缓存的功能。 我们常用的做法是发送一个“no-cache”的指令,但是实际使用过程中我们发现,这个指令对IE是有效的,但是对Firefox却没有效,这是因为,使用该指令Firefox不缓存HTTPS pages 但是还是会缓存HTTP pages ,这是Firefox的一个BUG,解决的办法很简单,就是使用no-store代替no-cache,同时发送no-store和no-cache指令https://www.360docs.net/doc/e417129959.html,中的处理方法,在不需要缓存的页面中添加如下代码 Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); Response.Cache.SetNoStore();

40个经典网页代码

40个经典网页代码 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键

no
可用于Table 2. 取消选取、防止复制 3. onpaste="return false" 不准粘贴 4. oncopy="return false;" oncut="return false;" 防止复制 5. IE地址栏前换成自己的图标 6. 可以在收藏夹中显示出你的图标 7. 关闭输入法 8. 永远都会带着框架 9. 防止被人frame 10. 网页将不能被另存为 11. 12.删除时确认 删除 13. 取得控件的绝对位置 //Javas cript function getIE(e){ var t=e.offsetTop; var l=e.offsetLeft;

相关文档
最新文档