发表于: 2017-11-21 22:45:15
1 688
今日完成的事情:
今天首先是学习redis,在昨天学习了memcache之后,再学习redis感觉就轻松了,但是再写代码的时候还是踩到了坑。
首先是下载安装,然后是修改配置文件:
第一处修改的地方,默认绑定127.0.0.1,只接收来自该IP的请求,修改成如上,或者注释,都可以,让其他IP也可以访问。
第二处修改的地方,使用保护模式,默认为yes,修改为no。可以让其他客户端也可以请求。
第三处修改的地方,使redis以守护进程运行,可以在后台运行,后台运行结果:
然后就可以在自己的项目中连接redis了,我连接之前做了一个测试:
@Test
public void redis(){
redisTemplate.opsForValue().set("hello"+1,"Hello World!");
System.out.println(redisTemplate.opsForValue().get("hello"+1));
}
在这里很顺利的运行了,但是在把redis配置到spring配置文件中时,发生错误。报错显示我的redis配置文件有无,但是经过我仔细查找,也没有发现问题。最后找了好久,发现是依赖不兼容:
<!-- redis依赖,注意这里会有依赖不适配 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.7.2.RELEASE</version>
</dependency>
jedis版本是2.9.0,但是spring-data-redis的版本最高只能是1.7.2,再高就要报错。
解决了这个问题之后就可以顺利运行了。
然后我有分别做了,从数据库取数据,分为json和jsp,从redis取数据,分为json和jsp,从memcached取数据,分为json和jsp:
//task6
//数据库Jsp页面
@RequestMapping(value = "jsp",method = RequestMethod.GET)
public String jsp(Model model){
User user=userService.queryUserById(1);
model.addAttribute("user",user);
return "test";
}
//数据库Json页面
@RequestMapping(value = "json",method = RequestMethod.GET)
public String json(Model model) throws IOException {
ObjectMapper json=new ObjectMapper();
User user=userService.queryUserById(1);
model.addAttribute("user",json.writerWithDefaultPrettyPrinter().writeValueAsString(user));
return "test";
}
//redis Jsp页面
@RequestMapping(value = "/redisJsp", method = RequestMethod.GET)
public String redisJsp(Model model) {
//获取redis中对应的value值
User reidsUser=redisTemplate.opsForValue().get("redisJsp"+1);
if(reidsUser != null){
//如果redis有对应key的value值,就直接返回数据
model.addAttribute("user",reidsUser);
}else {
//如果没有就从数据库取值,并保存在redis中
User user=userService.queryUserById(1);
model.addAttribute("user",user);
redisTemplate.opsForValue().set("redisJsp"+1,user);
}
return "test";
}
//redis Json页面
@RequestMapping(value = "redisJson", method = RequestMethod.GET)
public String redisJson(Model model) throws IOException {
ObjectMapper json = new ObjectMapper();
//获取redis中对应的value值
User redisUser = redisTemplate.opsForValue().get("redisJson"+1);
if (redisUser != null) {
//如果redis有对应key的value值,就直接返回数据
model.addAttribute("user",json.writerWithDefaultPrettyPrinter().writeValueAsString(redisUser));
logger.info("redis取数据");
}else {
//如果没有就从数据库取值,并保存在redis中
User user=userService.queryUserById(1);
model.addAttribute("user",json.writerWithDefaultPrettyPrinter().writeValueAsString(user));
redisTemplate.opsForValue().set("redisJson"+1,user);
}
return "test";
}
// @RequestMapping(value = "memcachedJsp",method = RequestMethod.GET)
// public String memcachedJsp(Model model){
// //获取memcached中对应key的value值
// User userMemcached= memcachedClient.get("memcachedJsp"+1);
// if(userMemcached != null){
// //如果memcached中有对应key的value值,直接返回数据
// model.addAttribute("user",userMemcached);
// }else {
// //如果memcached中没有值,就从数据库中取值,并保存在memcached中
// User user=userService.queryUserById(1);
// model.addAttribute("user",user);
// memcachedClient.set("memcachedJsp"+1,user);
// }
// return "test";
// }
// @RequestMapping(value = "memcachedJson",method = RequestMethod.GET)
// public String memcachedJson(Model model) throws IOException {
// ObjectMapper json=new ObjectMapper();
// //获取memcached中对应key的value值
// User userMemcached=memcachedClient.get("memcachedJson"+1);
// if(userMemcached != null){
// //如果memcached中有对应key的value值,直接返回数据
// model.addAttribute("user",json.writerWithDefaultPrettyPrinter().writeValueAsString(userMemcached));
// }else {
// //如果memcached中没有值,就从数据库中取值,并保存在memcached中
// User user=userService.queryUserById(1);
// model.addAttribute("user",json.writerWithDefaultPrettyPrinter().writeValueAsString(user));
// memcachedClient.set("memcachedJson"+1,user);
// }
// return "test";
// }
测试时发现,ememcached和redis不能在同一个程序中运行,所以在测试redis时我把memcached注释掉。
然后就是压测:
1)数据库直接取值:
jsp页面(20线程,10循环):
jsp页面(50线程,20循环):
json页面(20线程,10循环):
json页面(50线程,20循环):
json页面的数据比着jsp页面有性能提升。
2)redis取值:
jsp页面(20线程,10循环):
jsp页面(50线程,20循环):
json页面(20线程,10循环):
json页面(50线程,20循环):
在这里看到,用redis的情况下,在20线程,10循环下差不多,但是在50线程,20循环,就彻底翻车,数据就非常差。
3)memcached取值:
jsp页面(20线程,10循环):
jsp页面(50线程,20循环):
json页面(20线程,10循环):
json页面(50线程,20循环):
我在压测的时候,发现每次压测的数据变化好大,有的时候用缓存的情况下,90%也在1000多,有的时候只有200左右,波动好大。
还有就是有memcached和redis的情况下,50线程,20循环都跑不出好成绩,反而从数据库直接取值还比较好一点。
明日计划的事情:
明天看一下任务六,完善一下任务六,接着看任务七的内容。
遇到的问题:
有缓存的情况,测了好多次都跑不出好成绩。今天我已经重新写了接口,接口内容也已经简单化处理,就是为了测试,结果还是不能跑出满意的成绩。
收获:
memcached,redis还有jemter的基本用法已经掌握。
任务开始时间:2017/11/17
预计完成时间:2017/11/24
延期:无
禅道:http://task.ptteng.com/zentao/my-task.html
评论