memcache是什么
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
PHP的memcache
上例浏览器输出://连接 $mem = new Memcache; $mem->connect('127.0.0.1',11211) or die("Can't connect to memecahed server!"); //判断服务器是否在线 $online = $mem->getServerStatus('127.0.0.1'); if($online != 0) { echo 'Server Online<br/>'; } else { echo 'Server Not Online<br/>'; } //保存数据 $mem->set('name','Joe',0,60); $mem->set('age',12,0,60); $name = $mem->get('name'); $age = $mem->get('age'); echo 'Stored name is '.$var.', His age is '.$age.'<br />'; //age-2 $mem->decrement('age',2); $age = $mem->get('age'); echo 'Before 2 years ago,His age is '.$age.' old!<br/>'; //age-2+4 $mem->increment('age',4); $age = $mem->get('age'); echo 'After 2 years later,His age is '.$age.' old!<br/>'; //改变值 $mem->replace('age',18,false,30); echo 'But Someone change the age in IDCard to '.$mem->get('age').' years old!<br/>'; echo '服务器版本:'.$mem->getVersion().'<br>'; //关闭连接 $mem->flush();
memcache的使用
使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。
分布式应用
memcache本来支持分布式,我们客户端稍加改造,将有更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有UserId,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台memcache服务器上,以2开头的用户数据保存在第二胎memcache服务器上,存取数据都先按照UserID来进行相应的转换和存取。
但是这个有个缺点,就是需要对UserID进行判断,如果业务不一致,或其他类型的应用,可能就不是那么合适,那就需要根据自己的实际业务进行考虑,或者去想更适合的方法。
减少数据库压力
这个算比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,会导致数据库性能下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么就让memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。比如:
后端的数据操作模块,把所有SELECT操作提取出来(UPDATE/DELETE/INSERT先不管),然后把对应的SQL进行相应的hash算法得出一个hash数据key(比如MD5或Sha),然后用这个可以去memcache中查找数据,如果这个数据不存在,就说明还没有写入到缓存中,那么就从数据库中把数据提取出来,然后把数据set到memcache中,它的key就是SQL的hash值,然后设置一个失效时间,比如一个小时,那么一个小时中数据都是从缓存中提取的,就可以有效地减少数据库的压力。但缺点也是明显的,数据不实时,当数据做了修改后,无法实时显示到前端,并且可能对内存的占用比较大,毕竟每次SELECT出来的数据量可能比较巨大。
memcache安全
我们上面的memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险的,轻则数据泄露,重则服务器被入侵,因为memcache是以root权限运行的,况且里面可能还存在一些我们为之的bug或是缓冲区溢出的情况。
内网访问
最好把两台服务器之间的访问时内网形式的,一般Web服务器跟memcache服务器之间。普遍的服务器是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问memcache服务器,我们可以设置memcache服务器在启动的时候就监听内网的IP和端口,内网间的访问能够有效地阻止其他非法的访问。
memcache服务器端设置监听通过内网的192.168.0.200的11211端口,占用1024MB内存,并且允许最大024个并发连接#memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
设置防火墙
防火墙是简单有效的方式。如果两台服务器都是挂在网上的,并且需要通过外网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