打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
客户端缓存和服务器端缓存

在开发中缓存是经常要用到的,什么东西都一遍遍的找数据库问,数据库表示压力很大。
缓存方案常见的有两种,一种是在客户端,也就是web开发中的浏览器。一种是在服务器端,以memcached为代表。

浏览器缓存

这几天因为项目需了解了下浏览器缓存相关的知识。

重点说一下HTML5 Storage技术,之前的那些技术都是浮云,存不了什么东西还贼难用,各浏览器不兼容。
听名字就知道这是这两年刚出来的技术,相应的也就对浏览器版本要求比较高,低版本的浏览器不支持。对用公司内部用的话这个技术还是很不错的。
最多支持5M的容量,是个xml文件,备注:
Html5 storage最大支持5M容量
文件位置,根据系统用户位置会有区别。
C:\Documents and Settings\Administrator\Local Settings\Application Data\Microsoft\Internet Explorer\DOMStore\KF2G0R0O
也就是说别人都能看到你的数据,所以不能存放需要保密的内容。
每次用户登录的时候最好检查一下缓存版本是否跟服务器一致。

现在的项目中有个业务受理环节,设置的过程中需要大量使用一些基础数据。类似分公司、部门、产品列表这类数据,不经常变动,反复到服务器请求的话对服务器来讲是不小的压力。
业务受理的步骤很多,得点好几个下一步才能把操作完成,半截数据放到数据库里维护起来结构就复杂了。
因此考虑采用本地缓存技术,比较来比较去HTML5 Storage是不错的选择,反正都是公司同事可以要求都使用IE8以上浏览器。

下边这段是js中用到的代码

//用jquery方式,为加载缓存到本地按钮绑定方法
$('#loadBtn').bind('click',function(event){
if(supports_html5_storage()){
localStorage.clear();
load();
alert(
"数据已经缓存到本地!");
initCorpSelect();
initDptSelect(
"-1");
}
else{
alert(
"You're out!");
}


}
) ;
//清空缓存
$('#clearBtn').bind('click',function(event){
if(supports_html5_storage()){
localStorage.clear();
alert(
"本地缓存已经清空!");
initCorpSelect();
initDptSelect(
"-1");
}
else{
alert(
"You're out!");
}

}
) ;
//加载缓存到本地浏览器
function load(){
var params = {
url:
"${ctx}/crm/product/product/webstorage!ajaxLoad.do",
type:
"post",
dataType:
"json",
data:
null,
success:
function(response){
var corps = response.corps;
var dpts = response.dpts;
var stations = response.stations;

for(var i=0;i<corps.length;i++){
var corp = corps[i];
var jsCorp = new Corp(corp.corpCode,corp.corpName);
localStorage.setItem(
"corp."+corp.corpCode, jsCorp.toJSONString());
}


for(var i=0;i<dpts.length;i++){
var dpt = dpts[i];
localStorage.setItem(
"dpt."+dpt.dptCode, dpt.toJSONString());
}


for(var i=0;i<stations.length;i++){
var station = stations[i];
localStorage.setItem(
"station."+station.stationCode, station.toJSONString());
}

}

}
;
ajax(params);
}


服务器缓存

缓存解决方案很多了,只说刚刚用到的memcached。
memcached很好用了
1.安装启动memcached
2.写一个memcached客户端工具类,我用的是com.danga.MemCached.MemCachedClient 比较稳定,至于其他性能更高的目前没有需求没用到。
3.加载数据到memcached
4.程序中需要基础数据的时候从memcached获取。

/**
* memcached接口
*
@author ce
*
*/

public interface Imemcached {
/**
* 可增加,可覆盖
*/

public abstract boolean set(Object key, Object value);
public abstract boolean set(Object key, Object value,Date expire);
/**
* 只能增加;如果增加的key存在返回“false”
*/

public abstract boolean add(Object key, Object value);
public abstract boolean add(Object key, Object value,Date expire);

public abstract boolean delete(Object key);

/**
* 只能修改;如果修改不存在的key返回“false”
*/

public abstract boolean modify(Object key, Object value);

/**
* 如果key不存在返回null
*/

public abstract Object getKey(Object key);

/**
* 清除服务器上所有数据
*/

public abstract boolean flushAll();

/**
* 判断服务器上是否存在key
*/

public abstract boolean keyExists(Object key);

/**
* 一次获取多个数据,减少网络传输时间
*/

public abstract Map<String, Object> getKeys(String[] keys);


/**
* 设置是否使用字符串方式
*/

public abstract void setPrimitiveAsString(boolean flag);
}


实际测试结果
查询一张人员表,同时需要根据分公司编号,部门编号从分公司、部门表获取名称。
使用缓存技术的时候,不管客户端还是服务器端,因为只查询单表,速度明显比多表联合查询要快的多。
在系统使用高峰的时候这种差别明显能改善用户的操作体验。
实际测试了以下几种情况:

1.查询:
直接通过表关联的方式进行查询,速度最慢,开发最简便
查询结果列表中的公司名称、部门名称直接从数据库查出。
2.查询(本地缓存),缓存数据到本地,清除本地缓存:
速度最快,数据同步有一定工作量,需要高版本浏览器支持
查询结果列表中的公司名称、部门名称从本地缓存获取,增加_IE标识以区别。
3.查询(服务器缓存),缓存数据到服务器,清除服务器缓存:
速度也很快,也有数据同步问题,缓存数据到服务器比本地慢
查询结果列表中的公司名称、部门名称从服务器缓存获取,增加_mem标识以区别。





缓存使用总结

1.采用缓存技术后系统性能有明显改善,可以从性能测试工具明显感受到(这不是废话嘛,呵呵)。
2.缓存的数据同步问题必须解决好
3.项目中采用缓存技术需要统一规划,各系统不能互相干扰。
4.性能压力不明显的情况下,缓存开发要显得复杂一点。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
shiro安全框架扩展教程--如何扩展实现我们的缓存机制(第三方容器redis,memcached)
Memcached 高性能的分布式内存对象缓存系统 Memcached的安装、使用实例
Memcached笔记
Memcached在大型网站中应用|技术文章收集|灰灰的网络生涯
大型网站后台架构的Web Server与缓存
一致性哈希算法原理
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服