简介MemCache

一,什么是MemCache?

  MemCache是一个nosql数据库,是redis的前身,但严格来说他又不能算是一个数据库,因为他不支持持久化,

二,MemCache的原理及体系结构

  (1)MemCache实际上是在内存中维护了一张巨大的hash表。

  (2)MemCache各个节点之间是不支持通信的,因此不能构成集群结构(那如果要是能通信呢?)

 

三,MemCache的安装和配置

  配置前提:需要(MemCache安装包),和(删除自带的libevent但不要删除相关的依赖,安装libevent-2.0.21-stable.tar.gz),(安装gcc的编译器)(安装telnet)(我是linux虚拟上配置的找不到安装包的朋友可以私信我我发给你)

  (1)我的memcached-1.4.25.tar.gz放在/root/tools/MemCache目录下,执行tar -zxvf memcached-1.4.25.tar.gz

    (2)解压之后在/root/tools/MemCached/memcached-1.4.25目录下执行:./configure --prefix=/root/training/memcached --with-libevent=/root/training/libevent

    (3)执行make

  (4)执行make install

  (5)这个时候在你的/root/training/memcached/bin目录下执行./memcached -d -m 128 -u root启动MemCache

     这里讲讲启动MemCache这几个参数:-p 指定端口号

                 -d 启动守护线程

                 -m 指定最大内存使用(默认64M)

                 -u 指定用户名(root用户必选)

                 -c最大并发链接(默认1024)

怎样查看MemCache启动了呢?这里用jps是查看不到的,使用ps -ef|grep memcache如下图所示你的MemCache已经启动成功!!

 

四,操作MemCache(java api,telnet命令行)

   操作MemCache有两种方式telnet命令行,和java api我们一个一个来看

  (1)telnet命令行

   

  例:set key1 0 0 4    key1:key-value的key

               第一个0:标志位

               第二个0:过期时间,0表示永不过期

                4:存储长度

  get key1:可以获得你插入的值是多少

   其他的命令操作差不多

  (2)java api(需要一个jar包(spymemcached-2.10.3.jar),博客好像无法上传?

程序:

 1 import java.util.List;
 2 import java.io.Serializable;
 3 import java.net.InetSocketAddress;
 4 import java.util.ArrayList;
 5 import java.util.concurrent.Future;
 6 
 7 import org.junit.Test;
 8 
 9 import net.spy.memcached.MemcachedClient;
10 import net.spy.memcached.internal.OperationFuture;
11 
12 public class MemCacheTest {
13 @Test
14 public void testAdd() throws Exception{
15 
16 //使用set方法插入字符串
17 
18 //得到MemCache的客户端
19 MemcachedClient mc = new MemcachedClient(new InetSocketAddress("192.168.17.11", 11211));
20 
21 //执行set操作插入字符串
22 OperationFuture<Boolean> f = mc.add("key1", 0, "abcd");
23 
24   if(f.get().booleanValue()) {
25   mc.shutdown();
26 
27   }
28 }
29 
30 
31 @Test
32 public void testDX() throws Exception {
33 
34 //使用set插入对象
35 //创建一个MemCache客户端
36 MemcachedClient mc = new MemcachedClient(new InetSocketAddress("192.168.17.11", 11211));
37 
38 //set对象,注意用set插入对象的时候这个对象必须实现java的序列化
39 Future<Boolean> f= mc.set("stu001", 0, new student());
40 //关闭客户端
41 if(f.get().booleanValue()) {
42 mc.shutdown();
43 }
44 }
45 
46 
47 @Test
48 public void testInsertList() throws Exception{
49 /*
50 * 启动三个MemCached实例,客户端的路由算法
51 */
52 //创建一个List
53 List<InetSocketAddress> list = new ArrayList<>();
54 
55 //需要在MemCache上启动三个端口
56 list.add(new InetSocketAddress("192.168.157.11", 11211));
57 list.add(new InetSocketAddress("192.168.157.11", 11212));
58 list.add(new InetSocketAddress("192.168.157.11", 11213));
59 
60 //创建一个客户端
61 MemcachedClient client = new MemcachedClient(list);
62 
63 //插入20条数据
64 for(int i=0;i<20;i++){
65 System.out.println("插入的数据是:" + "key"+i+" "+"value"+i);
66 
67 client.set("key"+i, 0, "value"+i);
68 
69 //睡1秒
70 Thread.sleep(1000);
71 }
72 
73 //关闭客户端
74 client.shutdown();
75 }
76 
77 }
78 class student implements Serializable{
79 }

 

五,MemCache的路由规则

MemCache的路由规则有两个:1、求余

              求余即是对key值求余在上面java api操作时你是不是已经发现了key1和key2分别在不同的MemCache实例上呢?这就是MemCache的路由算法它由客户端来决定

              特点:适合大多数据要求,可以将数据均匀的放在每个实例上

                :当服务器需要多加几个,或者服务器宕机时将造成大量数据丢失

              

              2、一致性hash算法

                一致性hash算法是将每个实例都标志成一个个的区间比如11211:(0-333)11212:(334-666)11213(667-999)

                当key的标志位不同时,存放的MemCache实例也不同,在增加服务器时,一致性hash算法不会丢失数据,既是在宕机时丢失的数据也要比求余法要少

 

六,MemCache的主主复制功能(官方版本是不支持主主复制功能的)

    MemCache的主主复制功能官方版本是不支持的,在这里我将所有与MemCache相关的压缩包放在我的博客里供大家下载,

前提:需要memcached-1.2.8-repcached-2.2.tar.gz安装包(在两台机子(我的机子是bigdata11和bigdata12)上都需要这么做)

   (1)解压:tar -zxvf memcached-1.2.8-repcached-2.2.tar.gz

   (2)在/root/tools/MemCached/memcached-1.2.8-repcached-2.2下执行./configure --prefix=/root/training/memcache_replication --with-libevent=/root/training/libevent --enable-replication

   (3)make    :这里会出现一个error,不用怕,vi memcache.c文件,打开行号,56,58行前加“//”,再次make

   (4)make install

   (5)在bigdata11上的/root/training/memcache_replication/bin目录下执行:./memcached -d -m 128 -u root  -x bigdata12

    这里会出现一个error :./memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

    原因是你删除了系统的libevent但没有把自己安装的libevent加到系统的/usr/lib64/ libevent-2.0.so.5下去

    ldd memcache看一下系统缺少那些依赖

    

你会发现在 libevent-2.0.so.5 =>这一行你的指向地址是空的,解决办法:ln -s /root/training/libevent/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

再次执行./memcached -d -m 128 -u root  -x bigdata12

执行成功!!

在bigdata11上执行set key 0 0 4  value为asdf 在bigdata12上执行:get key操作 会得到asdf这说明我们成功了。

 

----------------------------------------------------------------------------------------------------------------------------------------------

谢谢大家的阅读,博主也是个大数据小白,有什么问题大家一起交流啊!

 

 

    

 

    

posted @ 2018-03-08 11:46  毅一  阅读(85)  评论(0)    收藏  举报