如何结合Python和Redis以提升WordPress性能

如何结合Python和Redis以提升WordPress性能

在 Python 世界中,许多开发人员都喜欢 NoSQL 数据库 Redis,因为它速度快,而且有各种强大的客户端库。在 WordPress 世界中,当需要持久对象缓存以加快后端数据访问速度时,Redis 通常是首选技术。

在使用 Python 应用程序处理 WordPress 内容时,您可以将这两个世界结合起来。

在本教程中,我们将演示如何通过构建一个使用流行的 redis-py 库的 Python 应用程序将内容直接发布到 Redis,以及如何通过 WordPress REST API 发布内容。

什么是 Redis?

Redis 或远程字典服务器是一种快速 NoSQL 数据库和内存缓存,由 Salvatore Sanfilippo 开发,Redis 有限公司(前身为 Redi Labs)维护。(前身为 Redi Labs)维护。Redis 的开源版本采用 Berkeley Source Distribution (BSD) 许可,Redis 有限公司还提供该服务器的商业企业版和云版本。

Redis 与其他 NoSQL 数据库的区别在于其数据存储机制。它通常被称为数据结构存储,因为它存储的数据与许多编程语言中的数据类型相同,包括字符串、集合、列表和字典(或哈希值)。除了支持简单结构外,Redis 还支持高级数据结构,可用于地理定位和流处理等任务。

Python 应用的先决条件

在开始创建应用程序之前,您需要在本地安装以下三个项目:

安装好先决条件后,就该让一切运转起来了。具体来说,您要创建一个 Python 应用程序,以字典格式获取用户的 WordPress 帖子,并将其保存到 Redis 缓存中。

创建 Python 应用将帖子存储到 Redis 缓存中

Redis 缓存是一种高效的网站缓存机制。它能存储经常请求的信息,以便更快、更方便地访问。缓存以键值数据结构存储信息。

首先,为你的项目创建一个名为 python-redis 的新文件夹。然后,启动命令终端cdpython-redis 并运行以下命令安装 redis-py:

pip install redis

安装完成后,在 python-redis 目录下新建一个名为 main.py 的文件。用你喜欢的文本编辑器打开该文件,输入下面的代码块。

首先导入新安装的 redis-py 库,并设置 Redis 主机和端口地址:

import redis
redis_host = 'localhost'
redis_port = 6379

现在,将 WordPress 帖子的值定义为字典中的键/值对。下面是一个例子:

post = {
'ID': 1,
'post_author': 1,
'post_date': '2024-02-05 00:00:00',
'post_date_gmt': '2024-02-05 00:00:00',
'post_content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
'post_title': 'My first post',
'post_excerpt': 'In this post, I will...',
'post_status': 'publish',
'comment_status': 'open',
'ping_status': 'open',
'post_password': 'my-post-pwd',
'post_name': 'my-first-post',    
}

注:在实际应用中,帖子内容可能来自 HTML 输入表单。

在代码中添加 redis_dict() 函数,该函数将连接本地 Redis 服务器,将上述帖子存储到 Redis 缓存中,并将成功创建的值打印到控制台:

def redis_dict():
try:
r = redis.StrictRedis(host = redis_host, port = redis_port, decode_responses=True)
r.hset("newPostOne", mapping=post)
msg = r.hgetall("newPostOne")
print(msg)
except Exception as e:
print(f"Something went wrong {e}")
# Runs the function:
if __name__ == "__main__":
redis_dict()

除非你在 Docker 中启动了 Redis,否则请使用以下命令调用 Redis 命令行界面:

redis-cli

现在运行 Python 脚本:

python main.py

执行脚本后,帖子就会添加到 Redis 的键值存储中。你应该能在终端控制台看到以下响应:

控制台输出显示 Python 应用程序帖子已添加到 Redis 存储中

控制台输出显示 Python 应用程序帖子已添加到 Redis 存储中

您已经成功地在本地 Redis 数据库中存储了一篇文章。

现在,让我们使用 WordPress REST API 将帖子上传到 WordPress 网站,并将其存储在默认的 MariaDBMySQL 数据库中,而不是 Redis 中。

使用 REST API 向 WordPress 上传帖子

WordPress REST API提供了一组端点,您可以从应用程序中调用这些端点与WordPress交互。我们使用 post 端点在 WordPress 中创建一个帖子。

第 1 步:在 WordPress 中设置应用程序密码

WordPress API需要一个应用程序密码,以允许您的应用程序访问WordPress网站的数据。密码是一个 24 个字符的密钥,您必须将其包含在对 REST API 的每个请求中。

在WordPress控制面板的用户个人资料页面上生成应用程序密码。您可以为每个应用程序密码指定一个用户友好的名称,但在生成密码后,您将无法查看密码本身(所以现在就复制一份):

在 WordPress 控制面板中生成应用程序密码

在 WordPress 控制面板中生成应用程序密码

注:WordPress 需要安全连接才能在生产环境中访问 REST API。如果你的开发环境无法使用 SSL 连接,你可能需要在 wp-config.php 中添加以下一行,”强制” WordPress 忽略安全限制:

define( 'WP_ENVIRONMENT_TYPE', 'local' );

第 2 步:使用 Python 应用程序向 WordPress 发帖

首先,安装用于向 WordPress API 发送 HTTP 请求的 Python 请求库。为此,在终端上运行以下命令:

pip install requests

然后,在 python-redis 文件夹中新建一个名为 app.py 的文件。然后,用文本编辑器打开该文件。

首先导入 requestsjsonbase64 模块:

import requests
import json
import base64

定义 API 基本 URL 以及 WordPress 用户名和密码。对于密码变量,请使用您在 WordPress 中生成的应用程序密码:

url = 'http://localhost/wp-json/wp/v2'
user = '<Your username here>'
password = '<Your application password here>'

现在,连接 user 和 password,对结果进行编码,并将其传递到请求标头:

creds = user + ":" + password
token = base64.b64encode(creds.encode())
header = {'Authorization': 'Basic ' + token.decode('utf-8')}

这是帖子正文:

post = {    
'author': 1,
'date': '2024-02-05 00:00:00',
'date_gmt': '2024-02-05 00:00:00',
'content': 'Test Post <br/><a href="http://www.my-site.com/">related blog post</a>',
'title': 'My second post',
'excerpt': 'In this post, I will...',
'status': 'publish',
'comment_status': 'open',
'ping_status': 'open',
'password': 'my-post-pwd',
'slug': 'my-second-post',    
}

设置向应用程序接口发出的 POST 请求和打印响应状态的命令:

r = requests.post(url + '/posts', headers=header, json=post)
print(r)

在终端中使用以下命令运行脚本:

python app.py

如果收到 201 响应(”已创建”),则表示资源已成功添加。

发布成功后会返回 201 响应代码

发布成功后会返回 201 响应代码

您可以在 WordPress 仪表盘或网站的 MySQL/MariaDB 数据库中确认这一点。

在 WordPress 中直接使用 Redis 缓存

WordPress 网站可以使用 Redis 缓存临时存储对象,如帖子、页面或用户。需要时,可以从缓存中访问对象。这种方法节省了宝贵的时间,减少了延迟,并提高了网站的扩展能力和处理更多流量的能力。

需要在你的 WordPress 网站上安装一个专用插件

例如,让我们在本地 WordPress 网站上安装 Redis Object Cache 插件。

Redis 对象缓存插件

Redis 对象缓存插件

用文本编辑器打开 wp-config.php 文件,在自定义配置变量部分添加以下代码:

define('WP_REDIS_CLIENT', 'predis');
define('WP_REDIS_HOST', 'localhost');
define('WP_REDIS_PORT', '6379');

注:Redis 主机地址取决于服务器配置。

在 WordPress 面板中导航至设置 > Redis。您应该会看到类似下面的内容:

Redis 对象缓存插件显示在 "设置" 选项卡中

Redis 对象缓存插件显示在 “设置” 选项卡中

现在,Redis 缓存已经成功取代了之前的 MySQL 数据库。

此外,前台 WordPress 网站使用的缓存与后台 Python 应用程序使用的缓存相同。您可以打开一个新终端并运行以下命令来测试这一点:

redis-cli monitor

浏览网站时,网站请求将输出到命令提示符:

使用 redis-cli 在终端监控服务器请求

使用 redis-cli 在终端监控服务器请求

现在前后端已经同步,你可以使用 Python 应用程序通过 REST API 向 WordPress 添加新文章。

为此,请修改 app.py 中的 POST 对象,使其包含新文章,然后运行 python app.py,将文章添加到缓存中。

小结

在本文中,我们学习了如何使用 Redis Python 客户端将 Redis 数据库连接到 Python 应用程序。该客户端支持多种 Redis 数据存储格式:列表、集合、字典和其他命令数据类型。

我们还看到了如何通过 REST API 和 Redis Object Cache 插件将 Redis 集成到 WordPress 网站中。

在网站中使用 Redis 内存缓存的功能使其成为一种强大而灵活的开发工具。Redis 在提高数据库查询速度、网站性能和总体用户体验方面异常有效。

评论留言