Memcached、Redis在PHP项目中的应用

2013-10-27

  之前使用Java做Web项目时,都是使用框架自带的持久化容器,现在做PHP项目,发现没有,只能采用第三方工具,如Memcached、Redis。相信做PHP Web是免不了要接触这两者的。Redis是一个NoSQL,还有一些其他的功能,这里只关注存储的功能。想要通过PHP连接它们,就需要有专门的驱动。因为Memcached和redis都非常简单,这些驱动也是非常简单的,从可选lib中选择一个即可。
  首先是Memcached,在PHP中被用来实现session功能,所以,Memcached 的服务一般独立占用一台或者多台物理机。如果是多台机器,就是分布式session。我们线上使用的Memcached机器一般是E5的CPU,80G内存,好像有多台机器,开发环境只需要虚拟机就够了。session很重要的一个特点就是”过期时间“。Java平台 的Web Container是持久运行的,所以能够提供单独的线程来删除过期的session,非常准时、准确。但是PHP+Memcached 就无法做到。我们只能手动的控制,框架写入Memcached时,会单独使用一个字段保存过期时间,框架在尝试读取Memcached时,代码判断过期时间,若过期,则删除Memcached key,返回null。我们还要明确一点,把Memcached作为session容器和 tomcat 应用中session容器还是不一样的。Memcached遇到内存不足时,会覆盖掉已有的数据,这将导致数据错误,所以,我们只能把Memcached作为缓存系统,降低对它的期望。而且要做到读写分离,有意义的数据一定要先写入DB,再写入Memcached,只把Memcached作为DB读取时缓存。一切重要的结果以DB为准,这样就不会出现逻辑错误了。Memcached本身不带分布式功能,所以,如果想要PHP服务器使用分布式缓存,就只能自己在连接服务器之前自行分配service服务器对Memcached连接,自行控制负载均衡。因为Controller层是不进行持久化的,所以controller 服务器不需要连接session服务器。
  redis 在网站中的使用更简单,一般用于非核心业务的数据存储,比如访问量计数、排行榜、黑名单/白名单、消息队列。别小看Redis,光这几项更能,Redis做的简直太好了,性能极其优越。Redis本身代码比较少,看源代码学习这个项目绝对是一个高效的学习方式。
  Memcached是不带文件保存功能的,而redis带有,所以,可以认为redis数据不那么容易丢失。且由于这个特性,作为数据库的Redis应用范围要广得多。

老笔记整理

如果有任何意见,欢迎留言讨论。


[ 主页 ]
COMMENTS
POST A COMMENT

(optional)



(optional)