简介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这说明我们成功了。
----------------------------------------------------------------------------------------------------------------------------------------------
谢谢大家的阅读,博主也是个大数据小白,有什么问题大家一起交流啊!