文章标签 ‘APC’
一直很想当然地觉得APC的性能一定比Memcache强,毕竟APC是内部Cache,Memcache是外部Cache。听说Cache数量超过一定阀值的时候,APC的性能不如Memcache,心里自然不信,要自己测试一下才行! 测试很简单,通过PHP读写一定次数的APC与Memcache,并对他们所消耗的系统时间进行对比,由于是同一台机器上同程序的比较,所以消耗的时间只是参考值,曲线应该是类似的。具体过程就不赘述了,重点看结果: 测试数据1:APC不同Cache数量百万请求消耗时间 Cache数量 百万请求消耗时间 10W 4.163 20W 6.504 30W 9.208 40W 11.1 50W 15.328 60W 16.139 70W 19.237 80W 21.22 测试数据2:APC保存不同Cache数量消耗时间 Cache数量 消耗时间 1W 0.035 10W 0.453 20W 1.391 30W 2.9 40W 5 50W 7.7 60W 11.228 70W 15.657 80W 20.218 测试数据3:Memcache不同Cache数量10W请求消耗时间 Cache数量 消耗时间 1W 3.2 2W 3 3W 3.1 4W 3.3 5W 4 [...]
目前Web应用的缓存方式多种多样,有APC,File,SQLite,Memcache等等各种类库实现着不同的缓存方式,如果单纯按他们的性能高低对他们进行选择,那将毫无意义,不但不会使你的应用加速,反而有可能给你带来灾难的后果,只有通过了解他们的实现方式,根据具体应用具体选择,才会使缓存系统发挥出最大的性能。 按照缓存系统存储方式不同,可以将缓存系统分为基于内存的缓存与基于文件的缓存。 PHP中,APC恐怕是最典型的基于内存的缓存,速度超级快,读写一个简单的32字节的字符串,可以达到1000000次/秒,这样的读写速度几乎可以忽略掉由于引入了额外的缓存系统而带来的性能消耗。 而对于基于文件的缓存系统来说,ZendFramework有一个基于文件的后端缓存实现(File)比较典型,基于文件的缓存系统具体读写速度没有做过评测,其性能由于受到磁盘IO的限制,所以远远不如内存型缓存速度来的快。 基于内存、磁盘这两种存储方式的基础上,通过存储不同格式的文件,或者提供不同的访问接口我们就可以实现不同的缓存系统了。例如最近非常流行的Memcache,就是在内存存储的基础上提供Socket的访问方式。再例如MemcacheDB,就是在将存储方式更改为磁盘文件,而访问方式不变。 按照缓存系统的可访问范围来分,又可以分为进程级缓存,单机缓存,分布式缓存。 同样的,APC同样是进程级缓存的典型代表,一个PHP FastCGI主进程就会开启一段APC SHM,并且与子进程共享,而多个PHP FastCGI主进程之间的APC SHM相互独立,无法共享,这恐怕也是APC缓存的一大缺陷。 文件型缓存则是单机缓存的代表,假如我们曾经将PHP的Session存储在文件内,一定会遇到多个Web服务器共享缓存的问题,这正是受文件型缓存访问范围的限制导致的。 分布式缓存系统则以Memcache为代表,他提供一个基于Socket的访问方式,使得该缓存系统支持远程读写访问。尽管这个缓存的内容可能是存在内存中,也可能是存在文件内。 其实话说回来,从本质上说,不同的缓存系统就是数据存储方式的不同与数据读写方式的不同,不同的存储方式与不同的读写方式的组合,造就了今天缓存系统百花齐放的场面,只有针对具体应用,判断各个缓存系统优缺点以及局限性,才能选择出最适合自己使用的缓存系统。
