PHP中对象缓存方式的选择


类似于Map的键值类型对象缓存对于提高应用的性能有很大的作用,实现此类缓存的方式也比较多,那么该如何选择对象缓存的方式呢?由于PHP常用的运行方式主要是基于FPM的形式,这篇文章暂不考虑常驻内存形式的缓存。

一、基于文件系统实现缓存

这应该是比较常见的一种形式,基于文件系统的缓存优点:

  • 不需要安装额外的扩展、中间件
  • 支持几乎所有运行环境
  • 支持文件锁

缺点:

  • 相对内存形式的缓存方式,性能一般
  • 存在并发读写时,性能极差(并发写,使用文件锁的情况)
  • 占用磁盘容量
  • 不好统计键调用次数等

适合的场景:单机运行,单键极少写请求,需要持久化的情况,比如动态页面的静态化。

二、基于数据库实现缓存

优点:

  • 支持几乎所有运行环境,仅需要安装对应数据库的驱动程序,大部分环境默认提供至少一种数据库驱动程序
  • 支持锁
  • 方便进行复杂的查询统计

缺点:

  • 作为最常遇到的性能问题点,不太适合用于缓存场景
  • 读写性能一般

适合的场景:无法控制宿主安装程序或者扩展。

三、基于Redis/Memcached等中间件实现缓存

优点:

  • 读写性能好
  • 支持集群运行
  • 支持多数据结构(Redis)
  • 本身支持缓存淘汰策略

缺点:

  • 需要额外的中间件
  • 需要额外的扩展、包支持
  • 大多数主机环境不支持(可喜的是随着公有云的发展,主机环境正在被新的虚拟化方式替代)

适合的场景:只要支持安装,适合绝大多数场景。