发表于: 2017-11-19 22:21:16

1 583


今日完成的事情:

今天开始学习缓存:

自己的理解:使用缓存将数据放到内存中,当有请求数据时,减少对数据库的操作。而且缓存速度非常快。

首先在自己的服务器上装了缓存:

刚开始自己是下载tar.gz包然后在服务器解压,安装,但是不知道哪里出了问题一直装不了。

最后用yum命令自动安装成功。

在这里我解释一下这几个参数的含义。

-p是设置Memcache监听的端口,监听默认的11211端口

-m是分配给Memcache使用的内存数量,单位是MB,我设置64M,根据教程设置的,第一次自己也不知道设置多少

-d是启动一个守护进程,就是作为后台运行

-u是运行Memcache的用户,在这了我设置的是root用户(在我的服务器上,不设置这个就报错)

然后是在telnet测试,我本来以为就是在telnet使用缓存,到后来意识到要在自己的接口上加上缓存。

然后是我的配置文件,使MemcachedClient作为bean配置到spring配置文件中(我修改后的配置文件):

<!-- 配置缓存 -->
<!-- 通过XmemcachedClientBuilder的工厂方法方式来创建MemcachedClient -->
<bean name="memcachedClientBuilder"
     class="net.rubyeye.xmemcached.XMemcachedClientBuilder">
   <constructor-arg>
       <list>
           <bean class="java.net.InetSocketAddress">
               <constructor-arg>
                   <value>www.mumengyang.top</value>
               </constructor-arg>
               <constructor-arg>
                   <value>11211</value>
               </constructor-arg>
           </bean>
       </list>
   </constructor-arg>
   <constructor-arg>
       <list>
           <value>1</value>
       </list>
   </constructor-arg>
   <!-- nio连接池大小,默认为1 -->
   <property name="connectionPoolSize" value="2"></property>
   <!-- 协议工厂 -->
   <property name="commandFactory">
       <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory"></bean>
   </property>
   <!-- 分布策略 -->
   <property name="sessionLocator">
       <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean>
   </property>
   <!-- 序列化转化器 -->
   <property name="transcoder">
       <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />
   </property>
   <!-- 是否启用failure模式 -->
   <property name="failureMode" value="false"/>
</bean>
<!-- 把MemcachedClient配置为Spring的Bean,并且指定factory-method和destroy-method方法 -->
<bean name="memcachedClient" factory-bean="memcachedClientBuilder" factory-method="build" destroy-method="shutdown"/>

这里我就不多解释了,因为上面我每一步都加了注释,上面是我任务二的内容(当时没有意识到加注释的主要性,现在觉得当时自己好幼稚)。

然后写了一个测试:

@Test
public void memcached(){
try {
memcachedClient.set("hello",0,"Hello World!");
       System.out.println("hello="+memcachedClient.get("hello"));
   } catch (InterruptedException e) {
e.printStackTrace();
   } catch (MemcachedException e) {
e.printStackTrace();
   } catch (TimeoutException e) {
e.printStackTrace();
   }
}

测试非常简单,直接贴运行结果:

在这里顺利运行,也出来了自己想要的东西,但是

这几句add和remove自己不是很理解,中间那个是我自己设置的key为hello,value为Hello World!

然后就是在控制器里面添加MemcachedClient:

@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
public String queryUser(@PathVariable int id,Model model) throws IOException {
ObjectMapper json=new ObjectMapper();
   try {
//根据ID从MemcachedClient取值
       User userMemcached=memcachedClient.get("id");
       logger.info("userMemcached中的值为:"+userMemcached.toString());
       //判断MencachedClient是否有值
       if(userMemcached != null){
//若MencachedClient有值,就从MencachedClient取值
           model.addAttribute("user",json.writerWithDefaultPrettyPrinter().writeValueAsString(userMemcached));
       }else {
//若MencachedClient为空,那么就从数据可取值,并且把取得的值设置进MencachedClient中
           User user=userService.queryUserById(id);
           memcachedClient.set("id",0,userService.queryUserById(id));
           model.addAttribute("user",user);
       }
} catch (TimeoutException e) {
e.printStackTrace();
   } catch (InterruptedException e) {
e.printStackTrace();
   } catch (MemcachedException e) {
e.printStackTrace();
   }

return "jsonUser";
}

然后运行结果:

是类型转换错误。

我仔细检查一遍,发现这一句有错(上面是我修改过后的内容):

memcachedClient.set("id",0,"userService.queryUserById(id)");

这里我把value值存进去一个String类型,所以报错。然后修改成上面那个样子,还是报同样的错。

我意识到已经从缓存那数据了,因为第一次的时候已经把value值设置成一个String类型。

然后我就修改成:

/根据ID从MemcachedClient取值
User userMemcached=memcachedClient.get("id");
logger.info("userMemcached中的值为:"+userMemcached.toString());
memcachedClient.delete("id");
logger.info("移除userMemcached中的值之后为:"+userMemcached.toString());

就是把这个缓存删除,但是依然报错。今天比较晚了,明天解决这个问题。

明日计划的事情:

把缓存这块的知识再巩固一下,然后解决掉问题。

遇到的问题:

从缓存读取数据失败,暂时没有解决。

收获:

缓存如何配置到ssm框架中,缓存的简单使用。

任务开始时间:2017/11/17

预计完成时间:2017/11/24

延期:无

禅道:http://task.ptteng.com/zentao/my-task.html



返回列表 返回列表
评论

    分享到