PHP缓存:Redis、Memcached及内置解决方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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

推荐