一、Memcache的安装和测试
1、使用yum工具安装Memcache
yum -y install memcached memcached-devel
因为没有telnet先安装
连接操作 telnet localhost 11211进行add、set、get操作
2、在PHP中测试使用memcache:
//连接
$mem = new Memcache;
$mem->connect("127.0.0.1",11211) or die('Memcache连接失败');
//保存数据
$mem->set('key1','This is first value',60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br />";
//替换数据
$mem->replace('key1','This is replace value',60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//保存数组
$arr = array('aaa','bbb','ccc','ddd');
$mem->set('key2',$arr,60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//关闭连接
$mem->close();
运行结果
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
二
、Memcache组建分布式缓存系统
小型应用只需要在一台服务器上配置缓存就够了,而大型社交类应用需要应对高并发和大数据的处理,所以就需要更多服务器缓存,分布式缓存就是采用多个缓存服务器将任务拆解分开处理。
1、单服务器应用
//连接
$mem = new Memcache;
$mem->connect("127.0.0.1",11211) or die('连接失败');
//保存数据
$mem->set('key1',60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//关闭连接
$mem->close();
2、分布式应用
//连接
$mem = new Memcache;
$mem->addserver('192.168.220.12',11211);
$mem->addserver('192.168.220.13',11211);
//保存数据
$mem->set('key1',60);
$mem->set('key2','This is second value',60);
$mem->set('key3','This is third value',60);
$mem->set('key4','This is forth value',60);
$mem->set('key5','This is fifth value',60);
$val1 = $mem->get('key1');
$val2 = $mem->get('key2');
$val3 = $mem->get('key3');
$val4 = $mem->get('key4');
$val5 = $mem->get('key5');
echo "Get key1 value: " . $val1 ."<br />";
echo "Get key2 value: " . $val2 ."<br />";
echo "Get key3 value: " . $val3 ."<br />";
echo "Get key4 value: " . $val4 ."<br />";
echo "Get key5 value: " . $val5 ."<br />";
//替换数据
$mem->replace('key1',60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//保存数组
$arr = array('aaa','ddd');
$mem->set('key2',60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//删除数据
$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";
//清除所有数据
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";
//关闭连接
$mem->close();
3、集群问题
Memcache存储数据的原理:
先把key做一个哈希算法,得到哈希值;哈希值除以memcache服务器个数,取余,得出存放数据的服务器。
一致性哈希原理:
临时增加一个memcache服务器,则之前key-value存放的服务器就会发生变化,此时取之前的值就会出现问题;此时,我们可以使用一致性哈希原理:每个服务器对应的是一段值,此时增加一个服务器,出现错误的概略会减少,但是,没有办法根治。
内存存储管理:
内存分配:
Memcache把内存分成大小不同的块,当数据来了后,找到一个最小匹配上块,来存储数据。
内存使用:
采用CAS(CAS: ClientAssessService)协议,而不是采用锁,解决多并发访问题。
客户端读取数据时,获得一个CAS-ID,当写入缓存前,先检查客户端CAS-ID和服务器端CAS-ID(最后一个客户端访问时的CAS-ID)是否相同,相同,可以修改,否则,不允许修改,这个和我们使用的版本控制的原理大致是一样的。
内存回收:
Lazy Expiration(惰性检测):
LRU(Least RecentlyUsed):
算法:近期最少使用算法。闲置内存—》过期内存—》最少使用。
Memcache和Redis的区别:
都是分布式缓存;官方提供Linux版,但都不提供win版;都可以实现集群的,只不过,Memecache是在客户端设置,而Redis是在服务器端设置;Memcache提供的存储类型单一,Redis提供的类型比较丰富;提供了很多种语言的驱动。
总结:
Memcache和Redis服务器都是分布式缓存思想的具体化,使用他们,可以使我们的web应用程序高效的被更多的用户使用。
4、安全性考虑
memcache的访问是无用户状态,安全性需要考虑,一般通过放在内网,并通过防火墙限制外网访问memcache端口来达到安全。
5、session应用
session.save_handler = files改成session.save_handler = memcached,
session.save_path = "N;MODE;/path"改成 session.save_path = "tcp://127.0.0.1:11211"。