发表于: 2017-11-09 22:38:58
1 733
今天完成的事情
继续学memcache
可以把memcache理解为一种数据库,mysql等数据库是将数据存储到硬盘上,而memcache是将数据存储到内存中的,读取内存中数据的速度比硬盘快得多,所以memcache会显得很快,还有另一点是memcache采用了键值对的形式来存储数据,所以查询速度很快。
在telnet中对memcache进行操作就类似于在cmd中对mysql进行操作
对于网站的高并发读写,传统的数据库会出现瓶颈,所以就用到了memcache
在实际使用中,通常把数据库查询的结果保存在memcache中,下次访问时直接从memcache中读取,而不再进行数据库查询操作,这样就在很大程度上减少了数据库的负担。
采用缓存的缺点时会出现缓存穿透,有两种原因
1.在memcache存放大量数据时,都会设置一个有效时间,如果在访问高峰期之前,memcache中的数据就因为到了有效时间而自动销毁了,大量的请求直接到达数据库进行操作,这样数据库容易挂掉。
2.查询一个一定不存在的数据,由于缓存中没有,会再到数据库中去查询,因为数据库中没有这条数据,所以也不会有数据写入缓存中,导致每次都要到数据库中去查找,失去缓存的意义。
尝试用java连接memcache并存入数据
需要引入jar包,maven仓库中只有下面这个,但是也不能成功导入
<dependency>
<groupId>spy</groupId>
<artifactId>memcached</artifactId>
<version>2.5</version>
</dependency>
查了一下,需要手动下载到本地仓库,再在pom中引入依赖,需要进行一些额外的配置
我直接在maven仓库中找了这个,能够直接添加依赖
<dependency>
<groupId>com.whalin</groupId>
<artifactId>Memcached-Java-Client</artifactId>
<version>3.0.2</version>
</dependency>
用了一下,是一样的效果,就没有用2.6.6的那个了
需要先配置连接
//配置服务点地址
String[] servers = {"127.0.0.1:11211"};
//得到一个连接池对象,并进行一些初始化工作
SockIOPool pool = SockIOPool.getInstance();
//设置服务端
pool.setServers(servers);
//为false时,如果连接管道失败,直接返回
pool.setFailover(false);
//初始化时对每个服务器建立的连接数目
pool.setInitConn(10);
//每个服务器建立最小的连接数
pool.setMinConn(5);
//每个服务器建立的最大连接数
pool.setMaxConn(200);
//Socket的参数,如果是true,在写数据时不缓冲,立即发送出去
pool.setNagle(false);
//Socket阻塞读取数据的超时时间
pool.setSocketTO(3000);
//为true会检查Scoket是否已经连接
pool.setAliveCheck(true);
//初始化完毕
pool.initialize();
具体方法的作用都写在了注释中了
创建一个具体的操作对象,进行测试
//得到具体的客户端操作对象
MemCachedClient mcc = new MemCachedClient();
//插入数据的三种方法
//第一种,如果key已经存在,直接覆盖重写
mcc.set("test1","测试1");
//第二种,只会添加,如果key已经存在,则返回false,添加不成功
mcc.add("test2","测试2");
//第三种,替换已经有的key
mcc.replace("test3","测试3");
执行结果:
replace()方法只能替换已有的key,不能添加新的
建立一个工具类,将以上的配置连接,以及一些具体方法封装,设置为静态方法,可以直接调用
代码太长,不贴了,可以参考 http://www.cnblogs.com/mycifeng/p/5882509.html
然后进行测试:
public class Test {
@org.junit.Test
public void testMemcache(){
MemcachedUtil.put("test2","测试1");
String test =(String) MemcachedUtil.get("test2");
System.out.println(test);
System.out.println(MemcachedUtil.get("test2"));
}
}
执行结果:
可以在telnet中查看:
中文问题,又是乱码
英文就没问题:
最后清空缓存:
MemcachedUtil.flushAll();
再查就没有数据了:
要将查询到的对象存储到memcache中,需要将对象序列化,明天再看
明天的计划
学习序列化和反序列化
遇到的问题
无
收获
了解了java连接memcache的具体方法
评论