Memcache基础教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Memcache基础教程
Memcache是什么
Memcache是的⼀个项⽬,最早是为 LiveJournal 服务的,⽬前全世界不少⼈使⽤这个缓存项⽬来构建⾃⼰⼤负载的⽹站,来分担数据库的压⼒。
它可以应对任意多个连接,使⽤⾮阻塞的⽹络IO。
由于它的⼯作机制是在内存中开辟⼀块空间,然后建⽴⼀个HashTable,Memcached⾃管理这些HashTable。
Memcache官⽅⽹站:/memcached,更多详细的信息可以来这⾥了解 :)
为什么会有Memcache和memcached两种名称?
其实Memcache是这个项⽬的名称,⽽memcached是它服务器端的主程序⽂件名,知道我的意思了把~~~~。
⼀个是项⽬名称,⼀个是主程序⽂件名,在⽹上看到了很多⼈不明⽩,于是混⽤了。
Memcache的安装
分为两个过程:memcache服务器端的安装和memcached客户端的安装。
所谓服务器端的安装就是在服务器(⼀般都是linux系统)上安装Memcache实现数据的存储
所谓客户端的安装就是指php(或者其他程序,Memcache还有其他不错的api接⼝提供)去使⽤服务器端的Memcache提供的函数,需要php添加扩展。
具体的配置⼤家可以参考:
:/257.html
:/258.html
:/259.html
:/261.html
:/306.html
:/395.html
PHP的Memcache
1 < ?php
2//连接
3$mem = new Memcache;
4$mem->connect("192.168.0.200", 12000);
5
6//保存数据
7$mem->set('key1', 'This is first value', 0, 60);
8$val = $mem->get('key1');
9echo "Get key1 value: " . $val ."<br />";
10
11//替换数据
12$mem->replace('key1', 'This is replace value', 0, 60);
13$val = $mem->get('key1');
14echo "Get key1 value: " . $val . "<br />";
15
16//保存数组
17$arr = array('aaa', 'bbb', 'ccc', 'ddd');
18$mem->set('key2', $arr, 0, 60);
19$val2 = $mem->get('key2');
20echo "Get key2 value: ";
21print_r($val2);
22echo "<br />";
23
24//删除数据
25$mem->delete('key1');
26$val = $mem->get('key1');
27echo "Get key1 value: " . $val . "<br />";
28
29//清除所有数据
30$mem->flush();
31$val2 = $mem->get('key2');
32echo "Get key2 value: ";
33print_r($val2);
34echo "<br />";
35
36//关闭连接
37$mem->close();
38 ?>
如果正常的话,浏览器将输出:
Get key1 value: This is first value
Get key1 value: This is replace value
Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
Get key1 value:
Get key2 value:
程序代码分析
初始化⼀个Memcache的对象:
$mem = new Memcache;
连接到我们的Memcache服务器端,第⼀个参数是服务器的IP地址,也可以是主机名,第⼆个参数是Memcache的开放的端⼝:
$mem->connect("192.168.0.200", 12000);
保存⼀个数据到Memcache服务器上,第⼀个参数是数据的key,⽤来定位⼀个数据,第⼆个参数是需要保存的数据内容,这⾥是⼀个字符串,第三个参数是⼀个标记,⼀般设置为0或者MEMCACHE_COMPRESSED就⾏了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这⾥设置了60,就是⼀分钟有效时间:
$mem->set('key1', 'This is first value', 0, 60);
从Memcache服务器端获取⼀条数据,它只有⼀个参数,就是需要获取数据的key,我们这⾥是上⼀步设置的key1,现在获取这个数据后输出输出:
$val = $mem->get('key1');
echo "Get key1 value: " . $val;
现在是使⽤replace⽅法来替换掉上⾯key1的值,replace⽅法的参数跟set是⼀样的,不过第⼀个参数key1是必须是要替换数据内容的key,最后输出了:
$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val;
同样的,Memcache也是可以保存数组的,下⾯是在Memcache上⾯保存了⼀个数组,然后获取回来并输出
$arr = array('aaa','bbb','ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
print_r($val2);
现在删除⼀个数据,使⽤delte接⼝,参数就是⼀个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br>";
最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接
$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br>";
Memcache的使⽤
使⽤Memcache的⽹站⼀般流量都是⽐较⼤的,为了缓解数据库的压⼒,让Memcache作为⼀个缓存区域,把部分信息保存在内存中,在前端能够迅速的进⾏存取。
那么⼀般的焦点就是集中在如何分担数据库压⼒和进⾏分布式,毕竟单台Memcache的内存容量的有限的。
我这⾥简单提出我的个⼈看法,未经实践,权当参考。
分布式应⽤
Memcache本来⽀持分布式,我们客户端稍加改造,更好的⽀持。
我们的key可以适当进⾏有规律的封装,⽐如以user为主的⽹站来说,每个⽤户都有User ID,那么可以按照固定的ID来进⾏提取和存取,⽐如1开头的⽤户保存在第⼀台Memcache服务器上,以2开头的⽤户的数据保存在第⼆胎Mecache服务器上,存取数据都先按照User ID来进⾏相应的转换和存取。
但是这个有缺点,就是需要对User ID进⾏判断,如果业务不⼀致,或者其他类型的应⽤,可能不是那么合适,那么可以根据⾃⼰的实际业务来进⾏考虑,或者去想更合适的⽅法。
减少数据库压⼒
这个算是⽐较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,⽆法同时服务更多的⽤户,⽐如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压⼒吧。
我们需要⼀种改动⽐较⼩,并且能够不会⼤规模改变前端的⽅式来进⾏改变⽬前的架构。
我考虑的⼀种简单⽅法:
后端的数据库操作模块,把所有的Select操作提取出来(update/delete/insert不管),然后把对应的SQL进⾏相应的hash算法计算得出⼀个hash数据key(⽐如MD5或者SHA),然后把这个key去Memcache中查找数据,如果这个数据不存在,说明还没写⼊到缓存中,那么从数据库把数据提取出来,⼀个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后相应的设置⼀个失效时间,⽐如⼀个⼩时,那么⼀个⼩时中的数据都是从缓存中提取的,有效减少数据库的压⼒。
缺点是数据不实时,当数据做了修改以后,⽆法实时到前端显⽰,并且还有可能对内存占⽤⽐较⼤,毕竟每次select出来的数据数量可能⽐较巨⼤,这个是需要考虑的因素。
Memcache的安全
我们上⾯的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联⽹上的话是⽐较危险,轻则数据泄露被其他⽆关⼈员查看,重则服务器被⼊侵,因为Mecache是以root权限运⾏的,况且⾥⾯可能存在⼀些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。
为了安全起见,我做两点建议,能够稍微的防⽌⿊客的⼊侵或者数据的泄露。
内⽹访问
最好把两台服务器之间的访问是内⽹形态的,⼀般是Web服务器跟Memcache服务器之间。
普遍的服务器都是有两块⽹卡,⼀块指向互联⽹,⼀块指向内⽹,那么就让Web服务器通过内⽹的⽹卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内⽹的IP 地址和端⼝,内⽹间的访问能够有效阻⽌其他⾮法的访问。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
Memcache服务器端设置监听通过内⽹的192.168.0.200的ip的11211端⼝,占⽤1024MB内存,并且允许最⼤1024个并发连接
设置防⽕墙
防⽕墙是简单有效的⽅式,如果却是两台服务器都是挂在⽹的,并且需要通过外⽹IP来访问Memcache的话,那么可以考虑使⽤防⽕墙或者代理程序来过滤⾮法访问。
⼀般我们在Linux下可以使⽤iptables或者FreeBSD下的ipfw来指定⼀些规则防⽌⼀些⾮法的访问,⽐如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻⽌其他的访问。
# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 --dport 11211 -j ACCEPT
上⾯的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻⽌⼀些⾮法访问,相应的也可以增加⼀些其他的规则来加强安全性,这个可以根据⾃⼰的需要来做。
本⽂转⾃:http://kimi.it/259.html。