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