(1)memcached应用

(一)memcached介绍

 (1) memcached是一个分布式缓存工具。与我们经常打交道的缓存技术,就是浏览器自带的缓存,我们知道像图片、css、js等这些静态文件就能被浏览器缓存起来。我们再访问相同网页的时候,这些缓存的文件就直接找浏览器去取而不再是请求服务器。减轻了服务器的压力。

 (2) 所谓静态文件,顾名思义就是一些不经常更新的文件;但是我们网站的内容都是动态的,所谓动态,也就是这些数据都是存储在数据库当中,每次请求都要向数据库索取。请求数据库也是磁盘操作,也是费时费力的。虽说是动态,但还有一些东西在短时间内也是不会更改的,而这些数据完全可以缓存起来。像购物网站分类导航。memcached正充当着这样一个角色。

 (3) memcached是分布式的,也就是memcached服务端这个软件可以安装到集群服务器当中,抑或一台服务器安装好几个memcached。这些memcached服务器是协同来处理用于请求的。所谓协同,就是每个memcached都会分配一个权重,如果权重值较大被访问到的几率也就大;如果权重值较小被访问到的几率也就较小。

 

(二)memcached服务端安装

(1) memcached服务端是用C语言来写的。在官网上只给出了Linux的版本,好不容易在网上搜查到了Win32版本,链接发布如下:

Win32_memcached服务端软件下载

(2)将这个压缩包解压,就出来一个“鹿头”的memcached.exe文件,没错!就是它了。运行它,会出现一个窗口,这个窗口一直打开着就说明memcached的服务端就一直运行着,那么它就能接收客户端的请求。客户端就可以自由发挥了,可以用各种语言来实现,本文用Java作介绍。

 在网上查了一下,现在比较流行的Java客户端一个是阿里的同学写的;另一个就是老外写的,顺便在Git上将其下载下来看了一下源码。源码后面将介绍,现在只说应用。

 这里只介绍这个老外写的Memcached Java客户端,我们需要下载memcached客户端Jar包和其所依赖的Jar包.

 

(三)创建工程

(1)现在我们就可以开始我们的项目了。建一个Memecached类,在其中提供向缓存当中存入数据和取数据的方法。(memcached服务端软件默认运行端口为:11211)

 1 public class MemCached{
 2     private static MemCachedClient mcc=new MemCachedClient();
 3     private static MemCached memCached=new MemCached();
 4 
 5     //服务区群
 6     private static final String[] services={"192.168.56.1:11211"};
 7     //服务器群各自对应的权重
 8     private static final Integer[] weights={1};
 9     //初始化连接数
10     private static final Integer init_connection=5;
11     //最大连接数
12     private static final Integer max_connection=50;
13     //最大空闲时间 60*60*6
14     private static final Long max_idle=21600L;
15     
16     
17     static {
18         //获取socket连接池的实例对象
19         SockIOPool pool=SockIOPool.getInstance();
20         pool.setServers(services);
21         pool.setWeights(weights);
22         pool.setInitConn(init_connection);
23         pool.setMinConn(init_connection);
24         pool.setMaxConn(max_connection);
25         pool.setMaxIdle(max_idle);
26         
27         //设置TCP的参数,连接超时等
28         pool.setNagle(false);
29         pool.setSocketTO(3000);
30         pool.setSocketConnectTO(0);
31         
32         //初始化连接池
33         pool.initialize();
34         
35         //超过指定大小就压缩
36         mcc.setCompressEnable(true);
37         mcc.setCompressThreshold(65536L);
38     }
39     
40     private MemCached(){}
41     
42     public static MemCached getInstance() {
43         return memCached;
44     }
45     
46     public boolean add(String key,Object value) {
47         return mcc.add(key, value);
48     }
49     
50     public boolean add(String key,Object value,Date expiry) {
51         return mcc.add(key,value, expiry);
52     }
53     
54     public boolean replace(String key,Object value) {
55         return mcc.replace(key, value);
56     }
57     public boolean replace(String key,Object value,Date expiry) {
58         return mcc.replace(key,key,expiry);
59     }
60     
61     public Object get(String key) {
62         return mcc.get(key);
63     }
64 

(2)测试方法

1 public class Test {
2     public static void main(String[] args) {
3          MemCached cache=MemCached.getInstance();
4          cache.add("username", "feiji");
5          System.out.println("从缓存中取出的值为:"+cache.get("username"));
6     }
7 
8 }

这样我们就能将键为“username”,值为“feiji”的键值对存入到缓存当中又能从其中取出来。

然后我们将第4行代码删掉,只要memcached服务端没有关闭,还是能查询出来。

当然我们还可以为这个存入的键值对加入过期时间。

这就好比一个应用场景,手机短信验证码。程序将验证码发给指定手机,这个验证码假设是在50S内有效。那么这个验证码在这50S内显然要能找到,肯定不能用数据库来存吧!!这时memcached就派上用场了。

测试代码如下:

 1 public class Test {
 2     public static void main(String[] args) {
 3          MemCached cache=MemCached.getInstance();
 4          long now=System.currentTimeMillis();
 5          long expiry=now+1000*50;
 6          Date date=new Date(expiry);
 7          cache.add("username", "feiji", date);
 8          System.out.println("从缓存中取出的值为:"+cache.get("username"));
 9     }
10 }

 

posted on 2014-10-24 20:12  飞机说之代码也疯狂  阅读(271)  评论(1编辑  收藏  举报