WordPress 对象缓存选 APCu 还是 Redis

26
折腾

前言

WordPress 装好之后第一件事就是搞缓存,这个应该不用多说。对象缓存层面,APCu 和 Redis 是最常见的两个选项。网上很多文章都在推荐 Redis,但我实际用下来发现,APCu 其实更快,Redis 的优势在于稳。这篇文章就聊聊我的感受。

APCu 为什么更快

APCu 是 PHP 的扩展,数据直接存在 PHP 进程的共享内存里。读数据就是读内存地址,没有网络 IO,没有进程间通信,延迟通常在 0.1ms 以下,速度是redis几十倍。

Redis 虽然也很快,但它是一个独立服务。哪怕装在同一台机器上走 Unix Socket,也有序列化、反序列化、socket 通信的开销。局域网 Redis 再多 0.5-2ms 的网络延迟。单次请求差这么点感觉不明显,但 WordPress 一个页面可能要查几十次缓存,累积下来差距就出来了。

在我的站点上测试的数据为,整体响应延迟减少了50毫秒表情包

根据群友的测试:在数据量比较小的情况下,redis甚至会提升延迟,当然我用的主题专门适配对象缓存,所以没有这种现象。

Redis 为什么更稳

APCu 快归快,缺点也很明显:

  • 只在本机有效,多台服务器没法共享。
  • PHP 进程重启(比如 php-fpm 重载)数据就全丢了。
  • 内存满了按 TTL 淘汰,没法做精细控制。
  • 没有持久化,冷启动要重新缓存。

Redis 是独立服务,这些问题基本都不存在。数据可以持久化到磁盘,重启后还在。可以配置 LRU、LFU 等淘汰策略。支持主从、哨兵、集群,挂了能自动切换。而且 WordPress 生态里,Redis 的插件支持是最全的,几乎每个缓存插件都内置了 Redis 选项。

简单说就是:APCu 像一辆轻量化跑车,速度快但只能一个人开;Redis 像一辆 SUV,没那么快但能装、能跑长途、出了事还能叫救援。

WordPress 场景下怎么选

我的建议很简单:

  • 单机小站,追求速度 → APCu。 我自己的博客就是 APCu,体感非常好。装个 php-apcu 扩展,再搞个支持 APCu 的对象缓存插件就完事,零运维。
  • 多台服务器或以后要扩展 → Redis。 服务器超过一台,APCu 就废了,Redis 是唯一选项。
  • 商业站、会员站,求稳 → Redis。 数据不能丢、不能出幺蛾子的时候,Redis 的持久化和成熟生态更让人放心。
  • 想速度快又想稳 → APCu + Redis 两级缓存。 Redis 做主缓存存全量数据,APCu 当 L1 存热点数据。读的时候先查 APCu,没有再去 Redis。热门数据享受 APCu 的零延迟,冷门数据由 Redis 兜底。

踩坑记录

  • APCu 默认 shm_size 才 32M,对于 WordPress 来说太小了,建议改成 128M 以上。太小的话命中率上不去,还不如不用。
  • Redis 装完默认没密码,直接暴露在公网上的话,几分钟就会被扫。记得配 requirepass,端口最好也改一下。
  • 如果只是拿 Redis 做缓存,建议关掉持久化或者把 save 间隔调得很长。纯缓存场景持久化没什么意义,重启后重新缓存就行。
  • 两级缓存方案在 WordPress 里不是开箱即用的,需要自己写对象缓存层或者用 LiteSpeed Cache 这种支持多级缓存的插件。

小结

  • APCu 更快,适合单机场景,追求极致速度。
  • Redis 更稳,适合多机或商业场景,求稳不求极限。
  • 如果条件允许,两级缓存是最优解。
  • 选哪个都行,关键是别两个都不装。

摸鱼小屋」 (aimoyu.ink)版权所有,引用、转载时必须标明原文出处!

Comments | NOTHING

    加载中

消息盒子
# 消息加载中 #