PHP中的缓存:Redis、Memcached及内置解决方案(进阶篇)

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

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

开始课程

PHP中的缓存:Redis、Memcached及内置解决方案:进阶篇



在现代Web开发中,应用性能直接影响用户体验、转化率和搜索引擎排名。缓存是加速PHP应用、降低数据库负载和减少响应时间最有效的方法之一。在进阶层面,开发者不仅需要连接Redis或Memcached,还需要理解失效策略、数据序列化、配置调优以及为特定任务选择正确工具。本文将深入探讨三种关键方法:Redis、Memcached以及PHP内置解决方案(OPcache、APCu),并介绍实际示例和反模式。



1. 内置解决方案:OPcache与APCu



在连接外部服务之前,应首先最大化利用PHP已有的功能。内置机制在解释器层面工作,无需安装额外软件。



1.1. OPcache

OPcache(原Zend Optimizer+)将PHP脚本编译并存储为共享内存中的字节码。这消除了每次请求时解析和编译代码的需要。对于大多数生产项目,OPcache默认启用,但其配置至关重要。



推荐的php.ini设置:

opcache.enable=1opcache.memory_consumption=128opcache.interned_strings_buffer=16opcache.max_accelerated_files=10000opcache.revalidate_freq=2opcache.fast_shutdown=1


重要提示: 在开发模式下,设置opcache.revalidate_freq=0和opcache.validate_timestamps=1,以便文件更改立即生效。



1.2. APCu(APC用户缓存)

APCu在共享内存中提供用户级缓存。它非常适合存储小型、频繁请求的数据:计算结果、配置、HTML片段。



APCu使用示例:

// 将数据缓存300秒apcu_store('user_profile_' . $userId, $profileData, 300);

// 获取数据if (apcu_exists('user_profile_' . $userId)) { $profile = apcu_fetch('user_profile_' . $userId);} else { // 生成数据 $profile = getUserProfileFromDB($userId); apcu_store('user_profile_' . $userId, $profile, 300);}


局限性: APcu仅在单台服务器内工作。在集群架构中,它不会在节点间同步,因此不适用于分布式系统。



2. Memcached:简单与速度



Memcached是一个分布式内存缓存系统。其主要优势是高速和简单。Memcached不支持持久化(数据仅存储在RAM中),也没有内置复制机制,使其成为临时缓存的理想选择。



2.1. 连接与基本使用

// 建立连接$memcached = new Memcached();$memcached->addServer('localhost', 11211);

// 存储数据,TTL为600秒$memcached->set('user_123', ['name' => '伊万', 'email' => 'ivan@example.com'], 600);

// 获取数据$user = $memcached->get('user_123');if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) { // 数据未找到——从数据库加载 $user = fetchUserFromDB(123); $memcached->set('user_123', $user, 600);}


2.2. Memcached进阶技巧

  • CAS(检查并设置): 允许原子更新数据,避免竞态条件。
  • Multi-get: 批量获取键值可减少网络调用次数。
  • 递增操作: 对于计数器(例如,浏览量),使用$memcached->increment()。




                
                

博客

书籍推荐