今天,我们很高兴地宣布发布 Redis 的四款全新高级客户端库的预览版本。我们将这些库命名为 Redis OM:Redis 的对象映射及更多功能。我们的目标是让您尽可能轻松地在应用程序中使用 Redis 和 Redis 模块。
我们推出的库支持 .NET、Node.js、Python 和 Java (Spring)。如果您是一位渴望了解我们为何如此兴奋于本次发布的软件开发者,现在就可以试用我们的一款新库。
适用于 .NET 的 Redis OM
适用于 Node.js 的 Redis OM
适用于 Python 的 Redis OM
适用于 Spring 的 Redis OM
每个 Redis OM 库都包含一个全面的 README 和教程,帮助您快速入门。
现在只想了解一个大概?请继续阅读!
作为程序员和计算机科学爱好者,我们热爱优秀数据结构的优雅。而且,众所周知,Redis 提供了大量坚如磐石的分布式数据结构。Redis 贯穿了一种Unix 哲学:您可以组合一套精心构建的原语来解决手头的任何问题。这种可组合性使得 Redis 用户能够创建各种各样的工具,包括缓存、分布式锁、消息队列、速率限制器、发布/订阅系统、后台任务执行器、重复数据删除器和权限系统等。
挑战在于并非每个人都有时间独自重新发明这些工具。并非每个人都有精力构建自己的速率限制器,或者弄清楚如何将 Redis hash 映射到 Java 类(反之亦然!)。我们构建(并持续构建)Redis OM,以便您即使没有时间使用 Redis 提供的核心数据结构来组合自己的抽象,也能获得 Redis 的高性能。
Redis OM(发音为“ōm”)是 Redis 的对象映射(及更多功能)。我们的目标是为您提供一个高级抽象工具箱,让您在熟悉的编程环境中轻松使用 Redis 数据。我们提供的第一个抽象是对象映射。如果您正在建模任何领域,您很可能以面向对象的方式表示该领域。Redis OM 库允许您透明地将域对象持久化到 Redis 中,并使用流畅的、以语言为中心的 API 查询它们。
对于这个首次预览版本,我们专注于对象映射和流畅查询。由于 Python 对我们程序员来说是一种通用语言 (lingua franca),让我们通过 Redis OM for Python 的几个示例来了解这里有哪些可能性。
首先,我们可以定义一个简单的域对象。在这种情况下,该对象表示一个客户
class Customer(HashModel):
first_name: str
last_name: str
email: EmailStr
join_date: datetime.date
age: int
bio: Optional[str]
现在我们可以像这样创建一个新的 Customer 实例
andrew = Customer(
first_name="Andrew",
last_name="Brookins",
email="[email protected]",
join_date=datetime.date.today(),
age=38,
bio="Python developer, works at Redis, Inc."
)
然后我们可以通过调用其上的 save() 将这个新的客户实例写入 Redis
andrew.save()
Redis OM 库会自动为任何新对象生成一个唯一的 ID。为此,我们使用了 ULID(Universally Unique Lexicographically Sortable Identifiers,通用唯一字典序可排序标识符)。您可以将 ULID 视为一种用户友好的 UUID。ULID 是可排序的、全局唯一的、URL 安全的,并且在 base32 编码时相当易读。
想要一个例子?一个典型的 ULID 看起来像这样:01ARZ3NDEKTSV4RRFFQ69G5FAV
总之,一旦您将这些对象之一保存到 Redis,您就可以通过提供其唯一 ID 来检索它。在 Python 中,您可以通过 pk 属性访问该唯一 ID(pk 当然是指“primary key”,即主键)。
将唯一 ID 传递给 Customer.get(),您就可以取回您的对象了
Customer.get(andrew.pk)
使用 Redis OM 库,您可以通过两种方式序列化您的域对象。我们将这个 Customer 对象序列化为 Redis hash,因为它是一个简单的扁平结构对象。但如果您的对象字段数量多或包含嵌套对象,您可能更愿意将其序列化为 JSON(为此您需要源代码可用的 RedisJSON 模块)。
如果您正在将域对象映射到 Redis,您可能希望能够查询它们。RedisJSON(并通过代理使用 RediSearch)为 Redis 提供索引和查询功能。Redis OM 库利用这些功能,为您的域对象提供流畅的查询 API。
我们来看一个快速示例。使用 Redis OM Python 库,您可以构建流畅的表达式来查询您的数据。例如,这是一个查询,用于检索姓氏为“Javayant”或“Jagoda”的所有客户
Customer.find((Customer.last_name == "Javayant") | (Customer.last_name == "Jagoda")).all()
这些查询的优点在于它们始终是索引化的,因此默认情况下就很高效。请参阅我们最近的基准测试博客,了解您可能会看到的性能优势。
Redis OM 库有点像一个家族;它们的目标一致,即让使用 Redis 和 Redis 模块尽可能简单。同时,每个库都有自己的特定语言侧重点,所有这些都旨在让为之编写的 .NET、Node.js、Python 和 Java/Spring 软件工程师感到满意。想看一些示例吗?
适用于 Node.js 的 Redis OM 使用 TypeScript 编写,为 TypeScript 和 JavaScript 提供一流支持。
适用于 .NET 的 Redis OM 允许您使用 LINQ 查询 Redis 域对象。
Redis OM Spring 与 Spring 本机集成,扩展了 Spring Data Redis(以提供熟悉的接口),甚至增加了一些对 RedisBloom 的支持(它提供了概率数据结构)。
Redis OM Python 与流行的 FastAPI 框架本机集成。将 FastAPI 与 Redis 结合是构建高性能 Web 服务的好方法。Redis OM Python 也支持同步和异步使用。
我们很高兴宣布 Redis OM 库的这个预览版本,并迫不及待地想听取您的反馈。拉取请求和 Github Issues 固然很好,但我们也乐于直接交流。您可以在 Redis Discord 服务器上找到我们。来打个招呼,告诉我们您接下来需要什么!随着我们认真地继续开发和改进 Redis OM 库,我们欢迎您的想法、问题和贡献。