类似于Map的键值类型对象缓存对于提高应用的性能有很大的作用,实现此类缓存的方式也比较多,那么该如何选择对象缓存的方式呢?由于PHP常用的运行方式主要是基于FPM的形式,这篇文章暂不考虑常驻内存形式的缓存。
一、基于文件系统实现缓存
这应该是比较常见的一种形式,基于文件系统的缓存优点:
- 不需要安装额外的扩展、中间件
- 支持几乎所有运行环境
- 支持文件锁
缺点:
- 相对内存形式的缓存方式,性能一般
- 存在并发读写时,性能极差(并发写,使用文件锁的情况)
- 占用磁盘容量
- 不好统计键调用次数等
适合的场景:单机运行,单键极少写请求,需要持久化的情况,比如动态页面的静态化。
二、基于数据库实现缓存
优点:
- 支持几乎所有运行环境,仅需要安装对应数据库的驱动程序,大部分环境默认提供至少一种数据库驱动程序
- 支持锁
- 方便进行复杂的查询统计
缺点:
- 作为最常遇到的性能问题点,不太适合用于缓存场景
- 读写性能一般
适合的场景:无法控制宿主安装程序或者扩展。
三、基于Redis/Memcached等中间件实现缓存
优点:
- 读写性能好
- 支持集群运行
- 支持多数据结构(Redis)
- 本身支持缓存淘汰策略
缺点:
- 需要额外的中间件
- 需要额外的扩展、包支持
- 大多数主机环境不支持(可喜的是随着公有云的发展,主机环境正在被新的虚拟化方式替代)
适合的场景:只要支持安装,适合绝大多数场景。