发表于: 2017-11-09 22:38:58

1 732


今天完成的事情

继续学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的具体方法


返回列表 返回列表
评论

    分享到