发表于: 2017-11-22 22:47:57

1 633





今日完成的事情:


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;一个小知识点……因为memcachejar找不到,所以下载安装到本地仓库………用命令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经常爆红的原因,也有这个……改一下就好

 

 

然后使测试类为什么不报空指针了……….???????????好奇怪…………getid为空的时候……竟然还运行了…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





 



返回列表 返回列表
评论

    分享到