我们最新的课程 Redis for Python Developers (RU102PY) 现已在 Redis 大学上线! 您今天可以免费注册。
我创建了这门课程,所以在这篇文章中,我想介绍一下自己,告诉您更多关于课程的内容,并给您一个例子,说明您可以从为期五周的完整课程中学到什么。
我是一位拥有 10 多年经验的 Python 老手,也是《The Temple of Django Database Performance》一书的作者。 我创建 Redis for Python 开发者课程是因为 Redis 是现代互联网的重要组成部分,但找到使用 Redis 编写高效、组织良好的代码的模式却很难。
在 Python 中,有很多用于处理关系数据库的成熟模式,但 Redis 呢? 我见过许多对 Redis 的一次性调用散布在 Python 项目中,并且遇到过许多可以从 Redis 的地理空间功能或 Redis Streams 中受益但未能使用的应用程序。 我创建这门课程是为了给您提供使用 Redis 所有强大功能编写 Python 代码的明确模式。 在本课程中,您将把 Redis 深入集成到 Flask 应用程序中,获得在哈希、集合和排序集合中建模数据、构建地理空间索引以及使用 Redis Streams 的实践经验。
您还将学习如何通过管道和 Lua 脚本从 Redis 中榨取每一盎司的性能。 您将构建速率限制器和排行榜,了解 Redis 6 的新访问控制列表 (ACL) 的工作原理等等。
以下是您将在 Redis for Python Developers 中学到的一个示例。 当您从 Python 使用关系数据库时,您通常会使用 对象关系映射 (ORM) 库,例如 Django ORM, SQLAlchemy, 或 Peewee。 这些库允许您声明您的数据模型,如本例所示,该示例改编自 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 Developers 课程的示例应用程序中,我们使用 数据类来声明我们的 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 加载实例时,它会使用一个“schema”类来处理验证、序列化和反序列化数据。
请注意,模型声明没有提到 Redis。 这是故意设计的,也是示例项目架构的主要组成部分。 我们没有使用 ORM 来验证数据并将其持久化到 Redis,而是将这些功能分解为单独的部分。
对于验证和序列化,我们使用一个名为 marshmallow 的库。 Marshmallow 可以与数据类一起使用,以根据数据类中通过“schema”类存储的类型提示自动验证、序列化和反序列化数据。 请查看此示例,该示例为 SiteStats 实例创建一个 marshmallow schema 类,我们使用它来验证、序列化和反序列化 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 schema 类将 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 Developers 课程的兴趣!
我有没有提到这门课程是免费的? 所有五周的讲师指导学习、访问我们的社区聊天服务器、示例应用程序的源代码以及您可以获得的结业证书都是免费的!
RU102PY:Redis for Python Developers 可以为每位 Python 开发者提供一些内容,无论您是为您的第一份 Python 工作构建技能,还是为微服务架构设计消息代理。 所以快来 和我们一起学习! 我会在我们的 聊天服务器上回答任何问题,我期待与您见面。