php pdo 本身无内置缓存,需结合 redis 等外部缓存实现;应缓存读多写少、计算开销大、参数固定的查询,避免缓存动态敏感数据;缓存键推荐 sql 模板与参数哈希拼接,并支持版本号;读取前校验缓存,未命中则查库并回填;失效策略包括主动删除、标签批量清理、逻辑过期及 ttl 随机偏移防雪崩。

PHP PDO 本身不内置缓存机制,但可以结合外部缓存(如 Redis、Memcached 或 APCu)实现查询结果缓存,显著降低数据库压力、提升响应速度。关键在于合理判断缓存粒度、生命周期与失效策略,避免数据陈旧或缓存击穿。
缓存哪些查询结果?
不是所有查询都适合缓存。优先缓存:
- 读多写少的数据,如配置项、地区列表、商品分类树
- 计算开销大、SQL 复杂但结果变化频率低的报表类查询
- 带固定参数的预编译查询(如
SELECT * FROM users WHERE status = ?),便于键值标准化 - 避免缓存含用户上下文、时间敏感(如实时订单状态)、或返回大量动态数据的语句
如何生成稳定可靠的缓存键?
缓存键需唯一标识一次查询及其参数,推荐组合:
- SQL 语句去空格、统一大小写后的哈希(如
md5(trim(strtoupper($sql)))) - 参数序列化后哈希(
md5(serialize($params))),注意浮点数和 null 的序列化一致性 - 更稳妥做法:拼接 SQL 模板 + 参数哈希,例如
"user_list_".md5($sql)."_".md5(serialize($params)) - 可加入业务版本号(如
v2_)便于批量失效旧缓存
缓存读写逻辑怎么嵌入 PDO 流程?
在执行查询前检查缓存,命中则跳过数据库;未命中则执行 PDO 查询,并将结果写入缓存。示例结构如下:
DESTOON B2B网站管理系统是一套完善的B2B(电子商务)行业门户解决方案。系统基于PHP+MySQL开发,采用B/S架构,模板与程序分离,源码开放。模型化的开发思路,可扩展或删除任何功能;创新的缓存技术与数据库设计,可负载千万级别数据容量及访问。
立即学习“PHP免费学习笔记(深入)”;
// 伪代码示意
$key = $this->buildCacheKey($sql, $params);
$data = $cache->get($key);
<p>if ($data === false) {
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
$cache->set($key, $data, 300); // 缓存 5 分钟
}</p><p>return $data;注意:不要缓存 PDOStatement 对象或资源句柄,只缓存结果数组或 JSON 字符串;对大结果集考虑压缩(如 gzip)再缓存;设置合理的 TTL,避免长期脏数据。
如何安全地让缓存失效?
缓存失效比缓存写入更重要。常见策略:
- 写操作(INSERT/UPDATE/DELETE)后,主动删除关联的缓存键(如更新用户信息,删掉
user_123和user_list_...) - 使用缓存标签(Tag)机制(Redis 可通过 key 前缀 + set 实现简易 tag),按业务维度批量清理(如
invalidateByTag('user')) - 对高频更新表,改用短 TTL(如 10–60 秒)+ “逻辑过期”设计(缓存值内嵌 expire_time 字段,后台异步刷新)
- 避免“缓存雪崩”,不同 key 的 TTL 加随机偏移(如
300 + rand(0,60))










