dot 快速的未来即将来到您所在的城市。

加入我们参加 Redis 发布会

Redis OM .NET 简介

针对 .NET 和 Redis 的流畅 API 和对象模型

Redis 是一项很棒的技术,深受数百万开发人员的喜爱,原因有两个:速度和简单性。Redis 提供了一个直观的原生接口,逻辑上组织成程序员已经知道的 数据结构。此外,这些结构易于使用,并且经过出色优化。我们发布的针对 .NET 的全新客户端库 Redis OM 正是针对速度和简单性的这种终极融合。

什么是 Redis OM .NET?

Redis OM 是针对 Redis 的对象映射等功能。Redis OM 背后的动机是回答“开发人员如何在不了解所有 Redis 命令 的情况下从 Redis 中获得惊人的杠杆作用?”这个问题。对于此第一个预览版本,我们希望解决“我们如何在 Redis 中存储和查找我们的域对象?”这个问题。Redis OM .NET 的预览版本是一个对象映射器、一个辅助索引构建器,以及一个简化的强大查询构建器。所有这些都旨在帮助您使用 Redis 存储和查找您的域对象。

Redis 模块

模块 API 已经彻底改变了 Redis。模块为平台添加了极大的灵活性,同时为 Redis 提供了一些基本功能。特别是 RedisJSON 解锁了大量功能,尤其是在辅助索引和文档建模方面。虽然 Redis OM 适用于核心 Redis,但当您添加 RedisJSON 时,Redis OM 确实发挥了其优势,充分利用 RedisJSON 来创建一个丰富的强大 API,用于在 Redis 中对对象进行建模并对其进行查询。

功能

Redis OM .NET 的预览版本具有四项主要功能

  1. 对象建模
  2. 索引创建
  3. 流畅查询
  4. 流畅聚合

工作原理

在开始使用 Redis OM 之前,您需要在项目中安装该软件包。为此,只需运行 dotnet add package Redis.OM。Redis OM 库中的主要连接逻辑存在于 RedisConnectionProvider 中。此提供程序提供对三个不同的对象进行访问,您可以使用这些对象与 Redis 进行通信

  1. 使用 IRedisConnection,您可以使用 ExecuteExecuteAsync 方法直接与 Redis 交互。
  2. RedisCollection<T> 是一个泛型类型的对象集合。此接口提供了流畅的查询 API。
  3. RedisAggregationSet<T> 允许您使用 Fluent API 在 Redis 中构建和执行聚合管道。

连接到 Redis

要将 Redis OM 连接到 ASP.NET Core 中的 Redis,您应该将 RedisConnectionProvider 实例作为单例注入。为此,您将使用 Redis URI。如果您使用的是 .NET 6,则意味着打开您的 program.cs 文件并添加

builder.Services.AddSingleton(new RedisConnectionProvider("redis://localhost:6379"));

对于使用 Startup.cs 文件的 .NET 5,您可以在 Startup.ConfigureServices 中添加以下内容

services.AddSingleton(new RedisConnectionProvider("redis://localhost:6379"));

对对象进行建模和搜索

RedisJSON 允许您在 Redis 中本地存储 JSON 对象,并查询这些对象。但要查询您的 JSON,您需要先定义您的索引。为了简化此过程,我们在 Redis OM .NET 中引入了声明性模型,以允许您通过声明性接口定义这些索引。如果您想声明一个要在 Redis 中存储并对其属性进行索引的类,则可以使用 Document 属性装饰该类,然后使用 IndexedSearchable 属性装饰各个属性。 Indexed 意味着标准索引,而 Searchable 仅适用于字符串,并且意味着该属性可以使用全文搜索进行查询。接下来,您可以通过将新装饰的类型传递到 IRedisConnection.CreateIndex 方法来在 Redis 中创建索引。例如,如果您想声明一个包含索引的 Customer 类,您可以执行以下操作

// declare index
[Document(StorageType = StorageType.Json)]
public class Customer
{
   [Indexed]
   public string FirstName { get; set; }
   [Searchable(Aggregatable=true)]
   public string LastName { get; set; }
   [Searchable(Aggregatable=true)]
   public string PersonalStatement { get; set; }
   [Indexed(Aggregatable=true)]
   public int Age { get; set; }
}

// create index
connection.CreateIndex(typeof(Customer));

查询

创建索引后,您现在可以使用 RedisCollection<T> 查询 Redis 中的对象。因此,如果您将 John 作为 Customer 对象存储在 Redis 中,那么您可以查询他

var customers = provider.RedisCollection<Customer>();
var john = customers.First(x => x.FirstName == "John");

您还可以轻松地进行范围查询。例如,让我们查找所有尚未达到退休年龄的顾客

var customersNotOldEnoughToRetire = customers.Where(x => x.Age < 65);

使用 RedisCollection 和 RedisJSON,您可以像在 LINQ 中一样构建丰富且复杂的查询,Redis OM 将为您管理到 Redis 查询语言的转换。

聚合

除了查询之外,您还可以使用 Redis 聚合 来构建可以执行各种操作的聚合管道。例如,假设您想找到 3 年后每个顾客的年龄,您可以在 Apply 表达式中使用简单的算术运算来做到这一点,这将转换为 Redis 中正确格式化的聚合管道

var customerAggregations = provider.AggregationSet<Customer>();
customerAggregations.Apply(x =>x.RecordShell.Age + 3,
    "AgeInThreeYears");

您还可以将记录分组在一起,并计算其汇总统计信息。因此,如果您想按姓氏对顾客进行分组,然后计算汇总统计信息。例如,以下是如何计算平均年龄

var averageAgeOfFamilies = customerAggregations.GroupBy(x=>    x.RecordShell.LastName).Average(x=>x.RecordShell.Age);

总结

这仅仅是对 Redis OM for .NET 功能的简要概述。如果您想了解更多信息,您可以查看 教程 并查看 API 文档。我们计划在不久的将来为 Redis.OM 添加更多功能,为此,我们希望得到社区的反馈。来试试吧。如果您发现问题或想添加一些功能到库中,请在 GitHub 中打开一个 问题。当然,我们始终欢迎来自社区的贡献,因此 PR 总是受欢迎的:)。