WordPress 为网络提供了巨大的动力,但它的流行凸显了保持最佳性能的挑战。提高 WordPress 性能的一个强大解决方案是 Redis 对象缓存。使用这种内存键值数据库作为缓存,可以减少发送到网站主数据库的查询次数。
本指南将向您介绍如何为 WordPress 网站安装和使用 Redis 对象缓存。
了解对象缓存
加载 WordPress 页面时,服务器通常需要进行多次数据库查询,以获取显示页面所需的内容、设置和其他数据。每次查询都需要时间,随着网站的增长,这些微小的延迟会导致明显的速度减慢。
对象缓存可以将这些数据库查询的结果存储在内存中。缓存会存储您经常使用的查询,并等待您的需要。
对象缓存可以改变 WordPress 网站处理数据检索和处理的方式,其影响不仅仅是简单的速度提升。当网站流量突然激增时,例如在成功的营销活动期间或病毒式社交媒体发布之后,Redis 可以充当访客和数据库之间的缓冲区。
Redis 不会让每个访问者都触发新的数据库查询,而是从内存中提供缓存数据。这样,网站就能在不降低性能的情况下,在整个网站上处理更多的并发用户。
对于“黑五”的电子商务网站来说,Redis 缓存的产品信息可以减少数据库负载,让网站在不需要额外服务器资源的情况下处理更多的流量。这种效率可以直接转化为托管成本的节省,因为它可以利用现有的基础设施为更多的访问者提供服务。
WordPress如何使用数据库
了解 WordPress 与其数据库交互的方式有助于解释为什么缓存在网站成长过程中变得至关重要。考虑一下当有人访问网站主页时会发生什么。除非它响应的是页面缓存的结果,否则WordPress会协调数据库查询的复杂交响乐来构建一个动态页面。
让我们来看看一个典型的主页加载过程:首先,WordPress 查询 wp_options
表,获取网站的设置、主题配置和活动插件。
SequelAce 应用程序中的 wp_options 表。
如果侧边栏中有额外的小部件、区块或元素,就会触发额外的查询。例如,“最近发布的文章”部分需要文章数据,类别需要术语计数,任何搜索功能都需要建立索引。
在 WordPress 网站编辑器中编辑侧边栏。
如果您使用的是页面生成器插件或其他复杂的主题,这些查询将大大增加。动态内容的复杂性会更高。以常见的博客设置为例,帖子会显示作者信息、类别、标签和相关帖子:
WordPress 网站编辑器中的博客文章布局。
主页上的每个帖子预览都需要 WordPress 连接多个表中的数据。它从 wp_posts
中提取核心内容,从 wp_users
中获取作者详细信息,并从 wp_postmeta
中收集元数据。一个只显示十个帖子预览的主页可能要执行几十个独立的数据库查询。
WordPress数据库的瓶颈
这种数据库架构还揭示了影响性能的常见瓶颈。自定义文章类型虽然在组织内容方面功能强大,但通常需要依赖 wp_postmeta
来存储附加字段。
有些网站(比如网上商店或房地产目录)可能会在每次页面加载时进行数百次查询,仅仅是为了显示每个产品或房产。每种产品或房产都必须作为单独的元数据条目显示各自的详细信息,如面积、数量、价格、卧室、变化等。
wp_options
表可能成为另一个瓶颈。这是因为它将存储提供这些设置的任何插件的设置。
如果考虑到并发访问者的因素,这种影响会变得更加明显。每个用户都会触发自己的查询集,WordPress 将对每个查询进行独立处理。在流量激增时,这种处理会造成瓶颈,从而拖慢整个网站的运行速度。
这些数据库交互使得缓存变得非常重要。如果正确实施 Redis 对象缓存,它就能拦截这些重复查询,并将结果存储在内存中。WordPress 可以直接从 Redis 中检索预处理过的数据,而不是为每个访问者执行多个连接和元数据查询。这样,WordPress 往往可以将数十次数据库查询减少到一次缓存查询。
WordPress对象缓存的热门选择
说到 WordPress 的对象缓存解决方案,有多种选择。并不是每个主机都支持所有选项,这意味着您需要确保您选择的对象缓存能满足您的需求。
Memcached 是历史最悠久、应用最广泛的缓存系统之一。它是一种分布式内存缓存系统,简单而有效。由于历史悠久,它得到了很多支持,而且在资源使用方面通常很轻便。凭借良好的支持和文档,Memcached 是各级对象缓存的流行解决方案。
Memcached 网站
由于 Memcached 注重易用性,因此这种简单的键值存储可能不适合更复杂的应用场景。此外,它也不提供 “持久 ”存储,这意味着当下一个页面加载时,它就会清除。
Couchbase 可以提供更复杂的解决方案,它结合了文档数据库功能、典型的键值存储功能和内置集群功能。后一种技术可以自动进行数据分组,以提高性能–类似于 Windows 磁盘碎片整理程序提高操作系统磁盘性能的方式。
Couchbase 网站
不过,Couchbase 的键值存储是其文档驱动架构的次要部分。如果您需要减少查询限制并提高数据验证和一致性的准确性,这可能会成为一个问题。
Redis为何在WordPress中脱颖而出
对于 WordPress 而言,Redis 与其他直接竞争者相比具有多项优势。与 Memcached 不同,Redis 支持复杂的数据结构,如列表、集合和排序集合。这很好地满足了 WordPress 的数据组织需求,并为您提供了一种方法来扩展更大、更复杂的设置。
在使用这些不同的结构时,Redis 的“原子操作(atomic operation)”至关重要。简而言之,它使用事务的概念,将各种命令组合在一起一次性运行。实际功能比这更复杂,但原子操作通常能确保数据的一致性,这对任何 WordPress 网站来说都至关重要。
在 WordPress 中使用 Redis 还有两个好处:
- 持久性。Redis 可以将数据持久化到磁盘上。与内存解决方案相比,这提供了更好的数据持久性。
- 更好的内存管理。与其他缓存工具相比,Redis 提供了更复杂的内存管理选项。这能让你更好地控制对象缓存的行为。
Redis 的应用超出了对象缓存的范围,但对于 WordPress 来说,数据库解决方案的独特构成意味着它的键值存储几乎是一个理想的合作伙伴。
WordPress和Redis之间的关系
WordPress 通过 WP_Object_Cache
函数提供了自己的对象缓存功能。它的核心功能是作为网站代码和数据库之间的中间层,使用标准化函数来管理缓存数据。
当插件或主题请求数据时,WordPress 会首先使用这些内置函数检查对象缓存中是否存在数据。例如,以下代码用于检索用户的评论数:
function get_user_comment_count($user_id) { // Generate a unique cache key $cache_key = 'user_comment_count_' . $user_id; // Try to get the value from cache first $comment_count = wp_cache_get($cache_key, 'user-stats'); // If not in cache, query the database if (false === $comment_count) { global $wpdb; $comment_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM $wpdb->comments WHERE user_id = %d", $user_id ) ); // Store the result in cache for future requests wp_cache_set($cache_key, $comment_count, 'user-stats', 3600); // Cache for 1 hour } return $comment_count; }
当与 Redis 正确配置后,该功能会拦截数据库请求,并在 WordPress 查询数据库之前检查 Redis 缓存中是否存在所需的数据。
这种集成超越了简单的键值存储。Redis处理复杂数据结构的能力反映了WordPress的分层内容组织。例如,当 WordPress 需要检索复杂的查询结果(如父页面的所有子页面及其相关元数据)时,Redis 会将整个数据结构存储为单个缓存条目。
这种整合可以大大提高性能。Redis 将所有数据存储在内存中,这意味着访问时间以微秒为单位,而不是数据库查询通常所需的毫秒。这看起来并不重要,但对于数据库使用量大的网站来说,这种差异可以使页面加载时间快两到三倍。
WordPress 的对象缓存还通过额外配置支持高级 Redis 功能。例如,您可以实施缓存标签,进行更精细的缓存管理:
function get_category_posts($category_id) { $cache_key = 'category_posts_' . $category_id; $posts = wp_cache_get($cache_key, 'category-posts'); if (false === $posts) { $posts = get_posts(array( 'category' => $category_id, 'posts_per_page' => 10 )); wp_cache_set( $cache_key, $posts, 'category-posts', 3600, array( 'tags' => array( 'category_' . $category_id, 'front_page_content' ) ) ); } return $posts; } // Later, when a post in this category updates: wp_cache_delete_by_tag('category_' . $category_id);
WordPress 与 Redis 之间的这种关系创建了一个功能强大的缓存系统,可在保持数据一致性的同时智能地管理数据持久性。WP_Object_Cache
函数可确保您的所有插件和主题都能受益于 Redis 缓存,而无需直接实施。此外,Redis 的高级功能还能为复杂的 WordPress 安装提供所需的灵活性。
如何在WordPress主机上安装Redis
虽然 Redis 是建立对象缓存的常用方法,但并非每个主机都提供访问或集成功能。这意味着你可能需要在服务器上动手编写代码。
每个虚拟主机都有不同的方法来实现这一点,有些甚至不提供所需的 root 访问权限。不过,典型的步骤包括准备服务器、安装 Redis,然后配置 WordPress 以使用它。
准备和安装服务器
安装 Redis 需要一个正确配置的服务器环境。对于某些 WordPress 主机来说,这可能意味着你要选择一个合适的计划。一般的共享主机,甚至是托管级别的主机,都很可能无法安装 Redis。虚拟专用服务器(VPS)将是您努力的起点,但专用云主机将是理想的选择。
无论如何,你的 PHP 安装都需要 phpredis 扩展。安装后,Redis 就能与 PHP 一起工作了,这对于与 WordPress 一起工作也是必不可少的。你需要使用特定的编译标志和配置选项,这些选项有很多。
在 Ubuntu 系统上,使用以下命令安装所需的组件:
sudo apt-get update sudo apt install redis server
安装过程完成后,运行 sudo service redis status
检查 Redis 是否按预期方式运行。你可能还想运行 redis-cli --version
来检查安装是否按预期完成。
服务器上运行 Redis 后,就可以安装 phpredis
扩展了:
sudo apt-get install php-redis sudo phpenmod redis
以上就是安装 Redis 所需的全部步骤,但仍需根据服务器和可用资源配置 Redis。
Redis配置
在让 Redis 开始在你的网站上运行之前,你需要注意 Redis 服务器配置文件。首要任务是了解 WordPress 和 Redis 是否工作在同一台服务器上。通常情况下是这样,所以你需要绑定本地主机地址(127.0.0.1
)。
你可以选择任何编辑器来访问 Redis 配置文件,但 nano 最合适不过了,它几乎可以在你找到的所有服务器实例上使用:
sudo nano /etc/redis/redis.conf
在大多数情况下,你可以找到正确的行,并在保存更改之前取消注释:
bind 127.0.0.1 ::1 # listens on loopback IPv4 and IPv6
您可能需要进一步修改该配置文件。以下是 WordPress 网站的最佳设置:
maxmemory 256mb maxmemory-policy allkeys-lru appendonly yes appendfsync everysec save 900 1 save 300 10 save 60 10000
每种配置选择都有其特定用途:
- 256MB 的
maxmemory
设置为大多数 WordPress 安装提供了一个良好的起点。这一设置可防止 Redis 占用过多系统内存,同时保持足够的缓存空间,从而显著提高性能。 allkeys-lru maxmemory-policy
可确保最常访问的内容保留在缓存中。有些网站则更倾向于使用volatile-lru
,尤其是在缓存会话数据和常规内容时。appendonly
和appendfsync
设置管理 Redis 的持久化行为。虽然 Redis 主要用作缓存,但保持持久性可以防止服务器重启时缓存完全丢失。everysec
设置可在性能和数据安全之间取得平衡。
save
指令控制 Redis 何时创建数据集的时间点快照。示例配置告诉 Redis 保存
- 每次更改后,每 15 分钟保存一次。
- 10 次更改后每 5 分钟保存一次
- 10,000 次更改后每分钟保存一次。
这些持久化设置有助于保持缓存效率,同时防止数据丢失。
配置Redis安全性并测试更改
在这里,你还应该关注安全性。例如,你可以使用 requirepass
命令设置密码验证,甚至可以重命名“危险”命令。Redis 访问控制列表(ACL)对某些破坏性命令进行了限制,你应该查看整个列表,看看是否有任何命令会对你产生影响。
完成所有这些步骤后,最好测试一下 Redis 服务器的性能。Redis CLI 为此提供了多个基准命令:
redis-cli --latency redis-cli info | grep used_memory_human redis-cli info | grep connected_clients
简而言之,它们为持续监控建立了基准性能指标,应成为定期维护工作流程的一部分。
配置WordPress
一旦服务器上运行了 Redis,就需要对 WordPress 进行配置,将其用作对象缓存。配置通常包括指定 Redis 连接的详细信息,如主机、端口和任何身份验证凭据。
你可以手动将适当的对象缓存插件文件添加到 wp-content
目录中,不过安装一个专用的 Redis 对象缓存插件可能是实现这一目标的最佳方式。我们在此推荐的唯一一款插件就是上文提到的 Redis 对象缓存插件。Redis Object Cache 插件更像是一个将 WordPress 连接到键值存储的辅助工具。
安装之外的Redis管理
典型的 Redis 对象缓存安装提供了对 Redis CLI 的访问。
基本监控
该命令行界面具有强大的功能,可让您连接到 Redis 实例,并立即了解缓存的运行情况。例如,你可以揭示缓存数据模式、分析内存使用情况,并实时执行维护任务。
对于基本的监控,有几个基本命令需要注意:
redis-cli INFO stats # View cache hits and misses redis-cli INFO memory # Check memory utilization redis-cli MONITOR # Watch live cache operations
MONITOR
命令可实时流式传输缓存操作,准确显示 WordPress 与 Redis 的交互情况。这种可见性可以帮助你识别缓存模式和优化机会。SLOWLOG
命令可识别有问题的查询:
redis-cli SLOWLOG GET 10 # View the 10 slowest recent operations redis-cli SLOWLOG RESET # Clear the slow log for fresh monitoring
你还可以选择更多 Redis 功能。
更深入的Redis监控命令
控制资源的一个简单方法是监控 Redis 的连接限制。这是防止资源耗尽的绝佳方法:
redis-cli CLIENT LIST | wc -l # Count active connections redis-cli CONFIG GET maxclients # Check maximum allowed connections
WordPress 使用 Redis 来加快数据库的读取速度。缓存条目是持久的,将来可以再次缓存。为了支持这一点,Redis 为其存储的键支持“驱逐策略”。
不过,这也会带来内存压力方面的弊端。较低的“命中率”(将总操作数与对现有键的操作数进行比较)就是证明,因此跟踪以下指标至关重要:
redis-cli INFO stats | grep evicted_keys redis-cli INFO stats | grep hit_rate
如果你发现你的数据库确实存在内存压力,你可以选择增加可用内存、优化任何密钥过期策略并实施选择性缓存策略。具体方法取决于你的网站和内存压力。
使用 Redis 的图形用户界面
使用 Redis 命令和 CLI,你还能发现更多东西。这就是 Redis Insight 应用程序的用武之地。
Redis Insight GUI 应用程序
它提供了一个图形用户界面来查看 Redis 对象缓存,无需终端、服务器访问或命令行操作。就像使用 TablePlus 或 SequelAce 等工具查看 WordPress 数据库一样,Redis Insight 等应用程序可以快速设置,并简化工作流程。
常见的Redis挑战和解决方案
大多数情况下,你的 Redis 安装无需进一步维护即可正常工作。不过,有些 Redis 实施可能会带来一些挑战,需要你加以注意。例如,你可能会遇到 WordPress 无法检测到合适连接插件的警告。
当你选择使用 Redis Object Cache 以外的插件时,就会出现这种情况,在绝大多数情况下都可以忽略。但请注意,Redis 的最佳运行依赖于合适的连接插件。
例如,在 APM 工具中进行分析时,你可能看不到正确的指标。如果构建一个自定义 Redis 实例,就可以解决这个问题。
了解 Redis 集成的局限性也是一个好主意。例如,在使用非典型 WordPress 安装类型时,你可能会看到各种错误。
小结
Redis 对象缓存通过高效的数据存储和检索,为 WordPress 网站带来了强大的性能提升。成功的关键在于正确实施、定期监控和维护。
Redis 实施的每个阶段都建立在前一个阶段的基础上。首先,从正确的服务器配置开始。然后,与 WordPress 集成。最后,通过定期监控和优化,保持性能提升。这种方法将帮助您创建一个强大的缓存基础设施。
暂无评论内容