发表于: 2018-01-24 23:05:14
1 687
今天完成的事情:
1.学习Memcached 基本命令,改controller。
写入:
set :如果set的key已经存在,则更新key所对应的原来数据,更新的作用。
add:若果add的key存在,不更新,得到响应 NOT_STORED
读取:
get:得到key对应的value,如果key不存在,返回空。
两个查询页面需要频繁的读取数据库内容,改为使用缓存:
//在缓存中查找数据,如果没有,查询数据库,并写入缓存。
try {
if(memcachedClient.get("learnNum")==null){
learnNum = studentMapper.selectByStatus(1);
memcachedClient.set("learnNum",0,learnNum);
}
if(memcachedClient.get("workNum")==null){
workNum = studentMapper.selectByStatus(0);
memcachedClient.set("workNum",0,workNum);
}
if(memcachedClient.get("collegemap")==null){
collegemap = getCollege.GetCollegeMap();
String jsonMap = stringJson.MapToJson(collegemap);
memcachedClient.set("collegemap",0,jsonMap);
//在缓存中,则直接取缓存中的内容。
}else {
learnNum = memcachedClient.get("learnNum");
workNum = memcachedClient.get("workNum");
String jsonMap = memcachedClient.get("collegemap");
collegemap = stringJson.JsonToMap(jsonMap);
2.由于memcached只能存文本,我的Map类型需要转换为String,找了一下资料,选择使用Gson进行序列化,和反序列化操作。
toJson();
fromJson();
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
public class StringJson {
private Gson gson = new Gson();
public String MapToJson(Map<Integer, String> map){
String json = gson.toJson(map);
return json;
}
public Map<Integer, String> JsonToMap(String json){
Type type = new TypeToken<Map<Integer, String>>() {}.getType();
Map<Integer, String> map = gson.fromJson(json,type);
return map;
}
}
3.在服务器端安装memcache 并启动监听127.0.0.1 11211 ,内存分配64MB.
压测报告:
聚合报告:
tps:
查看nginx日志:发现服务端的响应时间基本位10ms左右,但是压测90%线在1698,说明网络延迟很大。(原因:使用的是国外服务器)
为了排除网络因素的干扰,直接在本地查看controller的响应时间:
使用缓存:
不使用缓存:
使用缓存效果很明显,数据库在频繁查询的时候会出现极慢的情况(应该是数据库压力太大),而使用缓存则完全没有。
遇到的问题:
1.memcached只支持文本协议,很多类型都需要转换。
收获:
1.对缓存的作用有了直观感受,对缓解数据库压力作用很大。
2.memcached在java中的基本写法。
3.学习了序列化与反序列化工具 Gson的基本用法。
明天的计划:
1.部署多web应用。
2.学习redis。
任务6开始时间:2018.1.23
预计完成时间:2018.1.28
禅道:http://task.ptteng.com/zentao/project-task.html
评论