发表于: 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



返回列表 返回列表
评论

    分享到