一.原理 

      Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像视频文件以及数据库检索的结果等。简单的说就是将数数据调用到内存中,然后从内存中读取,从而大大提高读取速度。

  Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。

  Memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。

工作原理:

Memcached 是以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,客户端可以由各种语言编写,目前已知的客户端 API 包括 PHP/Python/Ruby/Java/C#/C 等等。客户端首先与 Memcached 服务建立连接,然后存取对象。每个被存取的对象都有一个唯一的操作系统申请。Memcached将对象保存在一个巨大的Hash表中,它还使用NewHash算法来管理Hash表,从而获得进一步的性能提升。所以当分配给Memcached的内存足够大的时候, Memcached的时间消耗基本上只是LRU方式调度数据。LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的。LRU算法在实际的工作环境中会与操作系统相关,比如32位的操作系统,最大的寻址空间是4G,如果当前内存的使用超过了这个限度,将被调出内存,内存中总维持最新最常用的数据。64位操作系统大大扩展了内存的寻址能力,所以现在很memcached服务都是运行在64位系统上。

    二.与memcached区别

    其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。

    三.linux 安装

    

1.下载memcached服务器端安装文件http://danga.com/memcached/

2.下载libevent-1.4.12-stable.tar.gz,memcached需要用到socked,依赖此安装文件,下载地址:http://www.monkey.org/~provos/libevent/

3.由于linux系统可能默认已经安装libevent,

执行命令:rpm -qa|grep libevent查看系统是否带有该安装软件

如果有执行命令:rpm -e libevent-1.1a-3.2.1 --nodeps(由于系统自带的版本旧,忽略依赖删除)

4.安装libevent,

tar zxvf libevent-1.4.12-stable.tar.gz

cd libevent-1.4.12-stable

./configure --prefix=/usr/local/libevent-1.4 ,其中/usr/local/是libevent的存放目录

make

make install

5.安装memcached

tar zxvf memcached-1.4.0.tar.gz

cd memcached-1.4.0

./configure --prefix=/usr/local/memcached-1.4 --with-libevent=/usr/local/libevent-1.4.2/    ,其中其中/usr/local/是memcached-1.4的存放目录

make

make install

至此memcached安装完毕

6.启动memcached命令:

./memcached -d -m 1024 -l 192.168.1.110 -p 11211

# /usr/local/bin/memcached -d -m 200 -u root -l 192.168.1.91 -p 12301 -c 1000 -P /tmp/memcached.pid
相关解释如下:
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,这里是200MB
-u是运行Memcache的用户,如果当前为 root 的话,需要使用此参数指定用户。
-l是监听的服务器IP地址,如果有多个地址的话,我这里指定了服务器的IP地址192.168.1.91
-p是设置Memcache监听的端口,我这里设置了12301,最好是1024以上的端口
-c选项是最大运行的并发连接数,默认是1024,这里设置了256
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid
停止Memcache进程:
# kill `cat /tmp/memcached.pid`

7.查看是否建立成功

telnet测试memcached
telnet 192.168.1.2 11211

Trying 192.168.1.2...
Connected to 192.168.1.2.
Escape character is '^]'

查看版本

version

对Memcached缓存服务的状态查询,可以先telnet连接上服务:telnet 127.0.0.1 11211 ,然后使用 stats命令查看缓存服务的状态,会返回如下的数据:    
        time:    1255537291                               服务器当前的unix时间戳 
        total_items:    54                                     从服务器启动以后存储的items总数量 
        connection_structures:    19                    服务器分配的连接构造数 
        version:    1.2.6                                        memcache版本 
        limit_maxbytes:    67108864                    分配给memcache的内存大小(字节) 
        cmd_get:    1645                                      get命令(获取)总请求次数 
        evictions:    0                                            为获取空闲内存而删除的items数(分配给memcache的空间用满后需 
                                                                         要删除旧的items来得到空间分配给新的items) 
        total_connections:    19                           从服务器启动以后曾经打开过的连接数 
        bytes:    248723                                      当前服务器存储items占用的字节数 
        threads:    1                                             当前线程数 
        get_misses:    82                                      总未命中次数 
        pointer_size:    32                                    当前操作系统的指针大小(32位系统一般是32bit) 
        bytes_read:    490982                              总读取字节数(请求字节数) 
        uptime:    161                                           服务器已经运行的秒数 
        curr_connections:    18                             当前打开着的连接数 
        pid:    2816                                               memcache服务器的进程ID 
        bytes_written:    16517259                     总发送字节数(结果字节数) 
        get_hits:    1563                                      总命中次数 
        cmd_set:    54                                          set命令(保存)总请求次数 
        curr_items:    28                                       服务器当前存储的items数量

Ok,安装memcached1.4.5成功。

四.java客户客户端连接测试

由于使用的maven,所以请参看下面的方法:

1:下载你要使用版本的memcached。下载memcached client

2:将里面的   java_memcached-release_2.6.6.jar 这个文件 放在d盘或其他盘符

3:cmd 进入命令;

切换到d盘

运行命令:

 D:\>mvn install:install-file -Dfile=d:/java_memcached-release_2.6.6.jar -DgroupId=com.danga -DartifactId=memcached -Dversion=2.5.3 -Dpackaging=jar -DgeneratePom=true

然后在你的maven仓库 就看到com包下面多了一个dange文件夹 打开看看  有 ok 增加成功。

4:找到 \localRepository\com\danga\memcached 下面的maven-metadata-local.xml文件

把下面的话变一下

<groupId>com.danga</groupId>
  <artifactId>memcached</artifactId>
  <versioning>
    <release>2.6.6</release>
    <versions>
      <version>2.6.6</version>
    </versions>
    <lastUpdated>20150628145446</lastUpdated>
  </versioning>

变成 通用格式 放在项目的pom文件下面:

<dependency>
   <groupId>com.danga</groupId>
   <artifactId>memcached</artifactId>
   <version>2.6.6</version>
  </dependency>

然后保存一下 在maven libbraries下面就看到 memcached的jar包了 ok。

 package memcache;

 import com.danga.MemCached.MemCachedClient;
 import com.danga.MemCached.SockIOPool;

 import java.util.Date;

 /**
  * Created by Administrator on 2016/6/13.
  */
 public class CacheManager {
     private static MemCachedClient mcc = null;

     static {
         //String[] servers ={"127.0.0.1:11211"};
         String[] servers = {"192.168.1.110:11211"};
         //负载权重
         Integer[] weights = {100};
         //创建一个实例对象SockIOPool,设置mcc参数
         SockIOPool pool = SockIOPool.getInstance();
         pool.setServers(servers);
         pool.setWeights(weights);

         //设置初始连接数、最小和最大连接数以及最大处理时间
         pool.setInitConn(100);
         pool.setMinConn(100);
         pool.setMaxConn(500);
         pool.setMaxIdle(1000 * 60 * 60 * 6);  //6小时
         //设置主线程的睡眠时间
         pool.setMaintSleep(30);
         pool.setNagle(false);
         pool.setSocketTO(3000);
         pool.setSocketConnectTO(0);
         pool.initialize();
         //!!!注意:如果是我们自己的对象存放,最好重写序列化方法,不用使用默认。
         mcc = new MemCachedClient();

         //压缩设置,超过指定大小(单位为K)的数据都会被压缩
         // mcc.setCompressEnable(true);
         // mcc.setCompressThreshold(64*1024);

         //使用代码
 //        String key="id00001";
 //        boolean r = mcc.set(key,"succe2ss", new Date(10 * 60 * 1000));//10分钟
 //        System.out.println("SET "+ r);
 //
 //        System.out.println(mcc.get(key));
 //        System.out.println(mcc.get(key));
     }

     public CacheManager() {

     }

     public static MemCachedClient getMemCachedClient() {
         return mcc;
     }

     public boolean set(String key, Object obj) {
         return mcc.set(key, obj);
     }

     public boolean set(String key, Object obj, Date date) {
         return mcc.set(key, obj, date);
     }

     public Object get(String key) {
         return mcc.get(key);
     }

     public boolean add(String key, Object obj) {
         return mcc.add(key, obj);
     }

     public static void main(String[] args) {
         System.out.println(CacheManager.getMemCachedClient().set("11", "22"));
         System.out.println(CacheManager.getMemCachedClient().get("11"));
     }
 }
六.memcache客户端程序

1. 三种API比较 
1)      memcached client for java

较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。




2)      spymemcached

A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常 报timeOut等相关异常。




3)      xmemcached

XMemcached同样是基于java nio的客户端,java nio相比于传统阻塞io模型来说,有效率高(特别在高并发下)和资源耗费相对较少的优点。传统阻塞IO为了提高效率,需要创建一定数量的连接形成连接 池,而nio仅需要一个连接即可(当然,nio也是可以做池化处理),相对来说减少了线程创建和切换的开销,这一点在高并发下特别明显。因此 XMemcached与Spymemcached在性能都非常优秀,在某些方面(存储的数据比较小的情况下)Xmemcached比 Spymemcached的表现更为优秀,具体可以看这个Java Memcached Clients Benchmark。




2.  建议

由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。

XMemcached也使用得比较广泛,而且有较详细的中文API文档,具有如下特点:高性能、支持完整的协议、支持客户端分布、允许设置节点权重、动态增删节点、支持JMX、与spring框架和hibernate-memcached的集成、客户端连接池、可扩展性好等。

下面给出这三种客户端的示例程序。




3.  示例程序
1)      memcached client for java

从前面介绍的Java环境的Memcached客户端程序项目网址里,下载最新版的客户端程序 包:java_memcached-release_2.5.1.zip,解压后,文件夹里找到java_memcached- release_2.5.1.jar,这个就是客户端的JAR包。将此JAR包添加到项目的构建路径里,则项目中,就可以使用Memcached了。

示例代码如下:

package temp;

import com.danga.MemCached.*;

import org.apache.log4j.*;

public class CacheTest {

public static void main(String[] args) {

/**

* 初始化SockIOPool,管理memcached的连接池

* */

String[] servers = { "10.11.15.222:10000" };

SockIOPool pool = SockIOPool.getInstance();

pool.setServers(servers);

pool.setFailover(true);

pool.setInitConn(10);

pool.setMinConn(5);

pool.setMaxConn(250);

pool.setMaintSleep(30);

pool.setNagle(false);

pool.setSocketTO(3000);

pool.setAliveCheck(true);

pool.initialize();

/**

* 建立MemcachedClient实例

* */

MemCachedClient memCachedClient = new MemCachedClient();

for (int i = 0; i < 1000; i++) {

/**

* 将对象加入到memcached缓存

* */

boolean success = memCachedClient.set("" + i, "Hello!");

/**

* 从memcached缓存中按key值取对象

* */

String result = (String) memCachedClient.get("" + i);

System.out.println(String.format("set( %d ): %s", i, success));

System.out.println(String.format("get( %d ): %s", i, result));

}

}

}




2)      spymemcached

spymemcached当前版本是2.5版本,官方网址是:http://code.google.com/p/spymemcached/。可以从地址:http://spymemcached.googlecode.com/files/memcached-2.5.jar下载最新版本来使用。

示例代码如下:

package temp;

import java.net.InetSocketAddress;

import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class TestSpyMemcache {

public static void main(String[] args) {

// 保存对象

try {

/* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */

MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));

Future<Boolean> b = null;

/* 将key值,过期时间(秒)和要缓存的对象set到memcached中 */

b = mc.set("neea:testDaF:ksIdno", 900, "someObject");

if (b.get().booleanValue() == true) {

mc.shutdown();

}

} catch (Exception ex) {

ex.printStackTrace();

}

// 取得对象

try {

/* 建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号 */

MemcachedClient mc = new MemcachedClient(new InetSocketAddress("10.11.15.222", 10000));

/* 按照key值从memcached中查找缓存,不存在则返回null */

Object b = mc.get("neea:testDaF:ksIdno");

System.out.println(b.toString());

mc.shutdown();

} catch (Exception ex) {

ex.printStackTrace();

}

}

}




3)      xmemcached

Xmemcached的官方网址是:http://code.google.com/p/xmemcached/,可以从其官网上下载最新版本的1.2.4来使用。地址是:http://xmemcached.googlecode.com/files/xmemcached-1.2.4-src.tar.gz

示例代码如下:

package temp;

import java.io.IOException;

import java.util.concurrent.TimeoutException;

import net.rubyeye.xmemcached.utils.AddrUtil;

import net.rubyeye.xmemcached.MemcachedClient;

import net.rubyeye.xmemcached.MemcachedClientBuilder;

import net.rubyeye.xmemcached.XMemcachedClientBuilder;

import net.rubyeye.xmemcached.exception.MemcachedException;

public class TestXMemcache {

public static void main(String[] args) {

MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil

.getAddresses("10.11.15.222:10000"));

MemcachedClient memcachedClient;

try {

memcachedClient = builder.build();

memcachedClient.set("hello", 0, "Hello,xmemcached");

String value = memcachedClient.get("hello");

System.out.println("hello=" + value);

memcachedClient.delete("hello");

value = memcachedClient.get("hello");

System.out.println("hello=" + value);

// close memcached client

memcachedClient.shutdown();

} catch (MemcachedException e) {

System.err.println("MemcachedClient operation fail");

e.printStackTrace();

} catch (TimeoutException e) {

System.err.println("MemcachedClient operation timeout");

e.printStackTrace();

} catch (InterruptedException e) {

// ignore

}catch (IOException e) {

System.err.println("Shutdown MemcachedClient fail");

e.printStackTrace();

}

}

}

七.测试及遇到问题

在测试中发现,set 时一直false,而利用telnet连接 服务端口时是没问题的,后来百度了好多也没有得到有效的解决办法,左后突然想起防火墙的事情,关闭防火墙service iptables stop,ok

最新文章

  1. Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法
  2. dedecms内容管理系统学习
  3. go语言条件语句 if else
  4. uri,url.urn
  5. 【Android测试】【第十七节】Instrumentation——App任你摆布(反射技术的引入)
  6. MHA安装手记
  7. ArcGIS应用——四种计算图斑面积的方法
  8. 使用SignalR构建一个最基本的web聊天室
  9. OJ 1188 全排列---康托展开
  10. Windows 2003 + IIS6.0 相关 401.1 或 401.2 等问题解决
  11. Castle IOC容器构建配置详解(一)
  12. JQuery中常用方法备忘
  13. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
  14. BZOJ 2055: 80人环游世界 [上下界费用流]
  15. MySQL查询所有数据库表出错
  16. WordPress调用特色图片地址源,去除特色图片img标签其他样式
  17. Linux下ps -ef和ps aux的区别
  18. 高可用Redis(七):Redis持久化
  19. Python基础之集合
  20. iTOP-6818开发板支持AXP228电源管理[官方推荐最佳匹配]_支持动态调频

热门文章

  1. 51nod 1693 水群(神奇的最短路!)
  2. 读jQuery源码有感
  3. hdu 3579 Hello Kiki 不互质的中国剩余定理
  4. 数组类型的退化Decay
  5. django关系类型字段
  6. 微服务API网关
  7. 同步代码时忽略maven项目 target目录
  8. 20170708xlVBA添加新产品修改公式
  9. codeforces 555a//Case of Matryoshkas// Codeforces Round #310(Div. 1)
  10. 『PyTorch』第十六弹_hook技术