我们最新的课程,Redis for Python 开发人员 (RU102PY) 现已在 Redis 大学上线!您可以 立即免费注册。
我创建了这门课程,所以在这篇文章中,我想介绍一下我自己,详细说明课程内容,并举一个例子,让您了解完整的五周课程中能学到什么。
我是一位拥有 10 多年 Python 经验的资深人士,也是《Django 数据库性能宝典》一书的作者。我创建了 Redis for Python 开发人员课程,因为 Redis 是现代互联网不可或缺的一部分,但是很难找到编写高效、组织良好的使用 Redis 代码的模式。
Python 中有许多使用关系数据库的既定模式,但 Redis 呢?我见过许多 Python 项目中零散的 Redis 调用,还遇到过许多本可以从 Redis 的地理空间 功能或 Redis Streams 中受益的应用程序,但却未能使用它们。我创建这门课程是为了为您提供使用 Redis 提供的所有强大功能编写 Python 代码的明确模式。在本课程中,您将把 Redis 深度集成到 Flask 应用程序中,获得在哈希、集合和排序集合中建模数据、构建地理空间索引以及使用 Redis Streams 的实践经验。
您还将学习如何使用管道和 Lua 脚本充分发挥 Redis 的性能。您将构建速率限制器和排行榜,了解 Redis 6 的新访问控制列表 (ACL) 的工作原理,等等。
以下是一个示例,展示您在 Redis for Python 开发人员课程中将学到的知识。当您从 Python 中使用关系数据库时,通常会使用像 Django ORM、SQLAlchemy 或 Peewee 这样的对象关系映射 (ORM) 库。这些库让您可以声明您的数据模型,如以下改编自 Peewee 文档的示例所示
from peewee import *
import datetime
db = SqliteDatabase('my_database.db')
class User(Model):
username = CharField(unique=True)
class Meta:
database = db
在 Redis for Python 开发人员课程的示例应用程序中,我们使用 数据类 来声明我们的 Redis 数据模型。数据类是 Python 3.7 中引入的功能,可以根据类型提示自动生成“特殊”方法,例如 __init__() 和 __repr__()。
以下是课程中的一个示例模型
@dataclass(frozen=True, eq=True)
class SiteStats:
"""Reporting stats for a site."""
last_reporting_time: datetime.datetime
meter_reading_count: int
max_wh_generated: float
min_wh_generated: float
max_capacity: float
这个 SiteStats 模型表示示例应用程序中假设的太阳能阵列站点的统计数据。因为我们指定了该类应具有的字段,包括 last_reporting_time 和 meter_reading_count,所以该类的自动生成的 __init__() 方法接受这些参数并将它们作为成员添加到新的 SiteStats 实例中。
当应用程序将 SiteStats 实例保存到 Redis 或从 Redis 加载实例时,它使用一个“模式”类来处理数据验证、序列化和反序列化。
请注意,模型声明中没有提到 Redis。这是设计使然,也是示例项目架构的主要组成部分。我们不是使用 ORM 来验证和将数据持久化到 Redis,而是将这些功能分解成单独的部分。
对于验证(和序列化),我们使用一个名为 marshmallow 的库。Marshmallow 可以与数据类一起使用,根据数据类中通过“模式”类存储的类型提示自动验证、序列化和反序列化数据。请查看以下示例,该示例为 SiteStats 实例创建了一个 marshmallow 模式类,我们使用它来验证、序列化和反序列化 SiteStats 数据到 Python 字典或从 Python 字典反序列化。
SiteStatsSchema = marshmallow_dataclass.class_schema(SiteStats)
让我们在 ipython 终端中试一下。首先,让我们创建一个 SiteStats 实例。
In [3]: import datetime
In [4]: now = datetime.datetime.now()
In [5]: stats = SiteStats(last_reporting_time=now, meter_reading_count=5, max_wh_generated=22, min_wh_generated=1, max_capacity=100)
In [6]: stats
Out[6]: SiteStats(last_reporting_time=datetime.datetime(2020, 7, 31, 15, 8, 45, 109063), meter_reading_count=5, max_wh_generated=22, min_wh_generated=1, max_capacity=100)
接下来,让我们使用 marshmallow 模式类将 SiteStats 实例序列化或“转储”到 Python 字典中。
In [3]: import datetime
In [4]: now = datetime.datetime.now()
In [5]: stats = SiteStats(last_reporting_time=now, meter_reading_count=5, max_wh_generated=22, min_wh_generated=1, max_capacity=100)
In [6]: stats
Out[6]: SiteStats(last_reporting_time=datetime.datetime(2020, 7, 31, 15, 8, 45, 109063), meter_reading_count=5, max_wh_generated=22, min_wh_generated=1, max_capacity=100)
现在,让我们从字典中反序列化或“加载”数据到 SiteStats 实例中,并验证新对象是否与原始 SiteStats 对象相同
In [10]: stats2 = SiteStatsSchema().load(data)
In [11]: stats == stats2
Out[11]: True
这很方便,但是让这种设置更实用的是验证。如果我们向 SiteStatsSchema.load() 传递错误的数据会怎么样?让我们在 ipython 终端中试一下
In [13]: SiteStatsSchema().load({"meter_reading_count": "hey"})
[…]
ValidationError: {'meter_reading_count': ['Not a valid integer.'], 'min_wh_generated': ['Missing data for required field.'], 'last_reporting_time': ['Missing data for required field.'], 'max_wh_generated': ['Missing data for required field.'], 'max_capacity': ['Missing data for required field.']}
很酷吧!它能识别出我们没有为“meter_reading_count”键提供整数,以及缺少其他必需字段。
但是如何将这些模型持久化到 Redis 呢?为此,我们使用 数据访问对象 (DAO) 模式,本课程会深入讲解该模式。
我希望这个例子激发了您对 Redis for Python 开发人员课程的兴趣!
我有没有说过这门课程是免费的?所有五周的讲师引导式学习、访问我们的社区聊天服务器、示例应用程序的源代码以及您能获得的结业证书都是免费的!
RU102PY:Redis for Python 开发人员适合每一位 Python 开发人员,无论您是在为您的第一份 Python 工作积累技能,还是在为微服务架构设计消息代理。所以,快来 与我们一起学习吧!我会在我们的 聊天服务器 上回答任何问题,我期待着与您见面。