发表于: 2017-11-22 22:47:57
1 635
1;完成代码对比…….三种方式……..
首先是jsp的访问对比
//-------------------------------------Jsp-----------------------------------------------//
//获取一个student,跳转更新页
@RequestMapping(value = "jsp1/student/{id}", method = RequestMethod.GET)
public String get(@PathVariable("id") String id, Model model)
{
Student student = studentService.get(id);
model.addAttribute("Student", student);
return "update";
}
//----------------------------------Jsp&&Memcached---------------------------------------//
//获取一个student
@RequestMapping(value = "jsp2/student/{id}", method = RequestMethod.GET)
public String getMemcached(@PathVariable("id") String id, Model model)
{
Student student = studentService.getMemcached(id);
model.addAttribute("Student", student);
return "update";
}
//----------------------------------Jsp&&Redis-------------------------------------------//
//获取一个student
@RequestMapping(value = "jsp3/student/{id}", method = RequestMethod.GET)
public String getRedis(@PathVariable("id") String id, Model model)
{
Student student = studentService.getRedis(id);
model.addAttribute("Student", student);
return "update";
}
直接访问mysql……不稳定……几十到几毫秒……
Memcached的第一次访问也是几百……之后是几毫秒………缓存生效
Redis的访问没有缓存几百毫秒;有了缓存几毫秒……. 缓存生效
jsp压测数据.......mysql访问.....80线程可以........90line二百多.....
memcached...碾压.........80线程90line不到一百.....
大概200线程...90line是300多毫秒....
redis的是.......还是不行.....序列化时好时坏......记录到下面....
然后是json的对比….感觉有没有缓存意义不大……..查询都很快…
//------------------------------------Json----------------------------------------------//
//获取一个student
@ResponseBody
@RequestMapping(value = "json1/student/{id}", method = RequestMethod.GET)
public Student get2(@PathVariable("id") String id, Model model)
{
Student student = studentService.get(id);
model.addAttribute("Student", student);
return student;
}
//----------------------------------Json&&Memcached--------------------------------------//
//获取一个student
@ResponseBody
@RequestMapping(value = "json2/student/{id}", method = RequestMethod.GET)
public Student getMemcached2(@PathVariable("id") String id, Model model)
{
Student student = studentService.getMemcached(id);
model.addAttribute("Student", student);
return student;
}
//----------------------------------Json&&Redis------------------------------------------//
//获取一个student
@ResponseBody
@RequestMapping(value = "json3/student/{id}", method = RequestMethod.GET)
public Student getRedis2(@PathVariable("id") String id, Model model)
{
Student student = studentService.getRedis(id);
model.addAttribute("Student", student);
return student;
}
都很小……….
json压测试试......MySQL直接访问.......80线程的90线,优于jsp响应....可以
json的memcache测试..........简直超级碾压....80线程....90line几乎为0.........
然后200线程的90line......也是300多毫秒......似乎与jsp的响应能力相似...
redis还是有问题.....
2;再看一下…..实现类…问题很多…..记录到下面……..
//Memcached缓存查询
public Student getMemcached(String id)
{
Student student;
student = (Student) memCachedClient.get(id);
if (student == null) {
student = studentMapper.get(id);
if (student != null) {
memCachedClient.add(student.getId(), student);
}else{
System.out.println("该用户不存在!");
}
}
if (cal % 3 == 0) {
memCachedClient.flushAll();
}
cal++;
return student;
}
//Redis缓存查询
public Student getRedis(String id)
{
Student student;
Jedis jedis = jedisPool.getResource();
if (jedis.get(id) != null) {
//反序列化有空指针的异常,加try...catch..可以运行...最好还是判断....
student = (Student) SerializeUtil.unserialize(jedis.get(id).getBytes());
if (cal % 10 == 0) {
jedis.flushAll();
}
cal++;
} else {
student = studentMapper.get(id);
if (student != null) {
jedis.set(student.getId().getBytes(), SerializeUtil.serialize(student));
} else {
System.out.println("该用户不存在!");
}
}
jedisPool.getResource();
return student;
}
压测.....最好还是关掉日志........爆炸.....
3;了解学习序列化知识;
明确概念: 把对象转换为字节序列的过程称为对象的序列化;把字节序列恢复为对象的过程称为对象的反序列化。
A; 对象的序列化主要有两种用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
B;再简单说一下序列化以及反序列化的过程;
ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中;步骤:
1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
2) 通过对象输出流的writeObject()方法写对象。
ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。步骤:
1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
2) 通过对象输入流的readObject()方法读取对象。
4;一个小知识点……因为memcache的jar找不到,所以下载安装到本地仓库………用命令mvn install…..
mvn install:install-file
-Dfile= 文件地址……
-DgroupId= pom文件的groupid
-DartifactId= 依赖的artifactid
-Dversion= 版本号
-Dpackaging=jar打成jar
明日计划的事情:
1;完善压测内容报告
2;完善任务内容
3;提交任务,给师兄讨论
遇到的问题及解决方法:
1;很尴尬…….当时找不到jar…直接下载复制到本地仓库…….死活出不来……原来要用命令安装……安装好之后pom文件没问题……但是引用不成功……
又换了一个版本的…可以了….
然后又把pom依赖换回去…..也可以了……或许是第二次生效的替换了了第一次的内容………
2;就是用缓存的时候,要是把id当作key…很麻烦…..之前的id参数都要换…String…….
//Memcached缓存查询
public Student getMemcached(String id)
Student student;
student =(Student)memCachedClient.get(id);
if(student==null){
student=studentMapper.get(id);
if(student!=null){
memCachedClient.add(student.getId(),student);
……………….太麻烦了……….
public class Student implements Serializable
private String id;
private String name;
private String sex;
private int state;
而且有点想不通,为什么数据库的int……代码里string……也可以直接用…使序列化起作用了吗????
public class Student implements Serializable
private String id;
private String name;
3;还有就是,偶尔会冒出module没选择,或许是之前的项目,更新了名字,二使这些文件找不到路径,idea经常爆红的原因,也有这个……改一下就好
然后使测试类为什么不报空指针了……….???????????好奇怪…………get的id为空的时候……竟然还运行了…get方法….日志显示还真去了数据库里get一个空对象……然后还删除一个空对象……………?????????????
4;凡是出现null的地方,还是需要try…catch……
Try….catch….还是会错,,,虽然程序运行……..这也是try块的作用了...........
这里还有一个发现……加上try…catch之后,里面的对象信息就是虚的…..
之前
之后……此外还可以不再try块之外初始化,最后返回的直接调用返回
还可以这样……
return studentMapper.get(id);
对比memcache的…发现不是对象空转换对象时报空……应该是反序列化的时候报的空…又或者是.getBytes报的空……
还是加上判断吧………
Jedis jedis = jedisPool.getResource();
if (jedis.get(id) != null) {
//反序列化有空指针的异常,加try...catch..可以运行...最好还是判断....
student = (Student) SerializeUtil.unserialize(jedis.get(id).getBytes());
if (cal % 3 == 0) {
jedis.flushAll();
}
cal++;
} else {
student = studentMapper.get(id);
if (student != null) {
jedis.set(student.getId().getBytes(), SerializeUtil.serialize(student));
} else {
System.out.println("该用户不存在");
5;还有就是json……怎么跳转到编辑页面????只能返回一个字符串吗??
这是修改后的代码,直接获取一个student
@ResponseBody
@RequestMapping(value = "json1/student/{id}", method = RequestMethod.GET)
public Student get2(@PathVariable("id") String id, Model model)
{
Student student = studentService.get(id);
model.addAttribute("Student", student);
return student;
}
测试也可以,返回字符串
没修改之前的是这样….本意是跳到编辑的页面,也就是update.jsp…直接修改信息………
@ResponseBody
@RequestMapping(value = "json/student/{id}", method = RequestMethod.GET)
public String getRedis(@PathVariable("id") String id, Model model)
{
Student student = studentService.getRedis(id);
model.addAttribute("Student", student);
return "update";
}
实际结果就是一个字符串…….update……….
那json只能用来返回对象了么???????
6;……才注意到….日志时间少了小时….
更恶心的是…加上也没用了…………
日志文件没生效...还发现,小时还分大小写……HH表示24小时....hh表示12小时......
7;又一个浪费时间的问题…….反序列化…时好时坏…….
收获:
1;代码完成,测试完成大部分
2;学习了序列化知识
3;简单学习了json
评论