PHP缓存:Redis、Memcached及内置解决方案
缓存是提升Web应用性能的关键工具之一。在PHP中,开发者可以使用多种方法:从简单的文件缓存到强大的内存系统,如Redis和Memcached。本文将详细分析每种方案,提供代码示例,并帮助您为项目选择最佳解决方案。
为什么需要缓存?
没有缓存,每次对网站的请求都可能导致重复计算、数据库查询或外部API调用。缓存允许保存昂贵操作的结果,并从快速存储中返回。主要使用场景包括:
- 保存SQL查询结果(尤其是聚合和JOIN操作)。
- 缓存HTML片段(例如菜单、侧边栏)。
- 存储用户会话。
- 缓存外部API的响应。
1. Redis——内存缓存的王者
Redis 是一个高性能的内存数据存储,支持多种数据结构:字符串、列表、哈希、集合。PHP有多个客户端,最流行的是 predis/predis(纯PHP)和 phpredis(C扩展)。
安装
composer require predis/predis示例:缓存数据库查询结果
<?phprequire 'vendor/autoload.php';
use Predis\\Client;
$redis = new Client([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379,]);
function getUsersFromDb() { // 模拟慢查询 sleep(2); return ['user1', 'user2', 'user3'];}
$cacheKey = 'users:all';$cached = $redis->get($cacheKey);
if ($cached) { $users = json_decode($cached, true); echo "来自缓存:";} else { $users = getUsersFromDb(); $redis->setex($cacheKey, 3600, json_encode($users)); // TTL 1小时 echo "来自数据库:";}
print_r($users);Redis的关键功能:
setex()— 设置带生存时间(TTL)的键。expire()— 为现有键设置TTL。del()— 删除键。incr()— 原子递增(计数器)。
2. Memcached——简单与速度
Memcached 是另一个流行的内存系统,但与Redis不同,它只支持字符串值,没有内置数据结构。然而,对于简单的缓存,它凭借极简设计运行更快。
安装扩展
sudo apt install php-memcached# 或通过pecl:pecl install memcached示例:缓存HTML片段
<?php$memcached = new Memcached();$memcached->addServer('127.0.0.1', 11211);
function renderMenu() { // 昂贵的菜单生成 return '<nav><ul><li>首页</li></ul></nav>';}
$menuHtml = $memcached->get('menu:main');if ($menuHtml === false) { $menuHtml = renderMenu(); $memcached->set('menu:main', $menuHtml, 600); // TTL 10分钟}
echo $menuHtml;重要提示: Memcached默认不支持以秒为单位的TTL——时间以秒(整数)指定。如果传递0,缓存将永久存储。
3. APCu——PHP内置缓存
APCu(Alternative PHP Cache)是一个用于在单台服务器的共享内存中缓存数据的扩展。非常适合单页应用和小型项目。
安装
sudo apt install php-apcu示例:缓存配置
<?php$configKey = 'app:config';
if