数据库
首页 > 数据库> > Redis OM .NET Redis对象映射框架

Redis OM .NET Redis对象映射框架

作者:互联网

  Redis OM

  Redis OM 是 Redis 官方推出的对象映射框架,即:Object Mapping。让开发人员更简单、方便的操作 Redis 数据。Redis 存储的数据抽象为对象映射,支持基于对象的 Redis 数据持久化、流式查询操作。

  目前只支持 4 种开发语言:

  Redis OM for Spring

  Redis OM for .NET

  Redis OM for Node.js

  Redis OM for Python

  Redis OM .NET

  Redis OM .NET 是.Net 平台的 Redis OM,依赖 StackExchange.Redis 实现。借助 Redis OM .NET 可以实现对象操作的方式操作 Redis 数据,脱离 key/value 的操作方式。 查询支持大部分.Neter 最爱的 LINQ。

  快速开始

  安装对应包

  dotnet add package Redis.OM

  Redis 环境准备

  直接使用 Docker 的方式安装 Redis 环境。

  docker run -p 6379:6379 redislabs/redismod:preview

  标准的官方镜像是无法支持 Redis OM,需要 Redis Modules 支持,Redis OM 核心创建索引、查询数据依赖RediSearch这个 Module 实现。依赖的 Module 有:RediSearch、RedisJSON。 RedisJSON 的依赖不是必须的,但是会缺少相应的功能,如:模型嵌套、复杂查询(只支持 key 查询)

  Coding

  增加抽象对象定义

  [Document]

  public class Customer

  {

  [RedisIdField]

  public string Id { get; set; }

  [Indexed(Sortable = true, Aggregatable = true)]

  public string FirstName { get; set; }

  [Indexed(Sortable = true, Aggregatable = true)]

  public string LastName { get; set; }

  [Indexed]

  public string Email { get; set; }

  [Indexed(Sortable = true)]

  public int Age { get; set; }

  }

  Document、Indexed、Searchable 等特性介绍,介绍参考 Github -> document-attribute

  获取抽象对象的操作集合、创建索引

  var provider = new RedisConnectionProvider("redis://localhost:6377");

  var connection = provider.Connection;

  var customers = provider.RedisCollection<Customer>();

  connection.CreateIndex(typeof(Customer));

  查询数据、聚合操作等需要依据索引,所以一定要先调用connection.CreateIndex创建索引,对应 RediSearch 的FT.CREATE命令。

  connection.CreateIndex(typeof(Customer)) 创建索引重复执行会抛出异常Index already exists。虽然可以通过connection.Execute("FT.INFO", $"customer-idx")获取索引信息,但是第一次索引不存在时会抛出Unknown Index name。所以实际使用中可能需要一个 try-catch 包住CreateIndex方法避免异常。

  插入数据

  var id = customers.Insert(new Customer { FirstName = "Steve", Email = "xxxx@masa.com", Age = 1 });

  var id2 = customers.Insert(new Customer { FirstName = "FirstName", LastName = "LastName", Email = "xxxx@masa.com" });

  id,id2 为插入数据的 key,没有指定 Document 的 Prefixes 和 IdGenerationStrategy,则默认为 ULID 格式为{DocumentName}:{Ulid},如:`Cust

  插入数据时需要注意的是,如果对没有明确指定字段的值,如 LastName 不明确赋值:customers.Insert(new Customer { FirstName = "Steve", Email = "xxxx@masa.com", Age = 1 });,查看 Redis 中存的数据可以发现当前 key 存储的 json 数据没有未指定的字段对应的 key(此时 Query 或 Aggregations 会有些奇怪的错误)。可以根据自己需要,显示的为字段赋个零值或者在定义实体时使用public string LastName { get; set; } = string.Empty;的方式。

  查询数据

  var customer = customers.Where(x => x.Age == 0).OrderBy(a => a.FirstName).FirstOrDefault();

  var customerById = customers.FindById(id);//根据Id查找

  var emails = customers.Select(x => x.Email);//仅查询指定字段

  var takes = customers.Where(x => x.Age > 0).Take(10);//获取指定条数

  var adults = customers.Where(x => x.Age >= 0).Skip(5);//查询偏移

  对于空值的判断,x.FirstName == ""【语法错误】 或 string.IsNullOrEmpty(x.FirstName)【不支持】。Redis 哈希中不能有空字符串,所以类似的查询应该通过聚合操作的Exists方法实现

  foreach (var agg in customerAggregations.Apply(x => ApplyFunctions.Exists(x.RecordShell.LastName), "LastNameExists"))

  {

  Console.WriteLine($"{agg["LastNameExists"]}");

  }

  聚合操作

  流水线(Pipelining)同时发送多个请求,从而减轻延迟。结果的查询和转化都在 Redis 端完成。

  RecordShell 是远端 Index 类型的结构,RecordShell 应该只在聚合操作流水线内部使用,运行时并没有真正的值。

  拼凑 FirstName 和 LastName,返回 FullName

  var customerAggregations = provider.AggregationSet<Customer>();

  var age = customerAggregations.Average(x => x.RecordShell.Age);

  var sets = customerAggregations.Where(a => a.RecordShell.FirstName == "Steve").Apply(x => string.Format("{0} {1}", x.RecordShell.FirstName, x.RecordShell.LastName), "FullName");

  foreach (var item in sets)

  {

  Console.WriteLine(item["FullName"].ToString());

  }

  聚合分组

  通过 GroupBy 方法,依据不同属性进行分组聚合(支持单字段分组和多字段分组)。

  var res = customerAggregations

  .GroupBy(x => x.RecordShell.FirstName)

  .GroupBy(x => x.RecordShell.LastName)

  .ToArray();

  var res1 = customerAggregations.GroupBy(x => x.RecordShell.FirstName).CloseGroup().ToArray();

  CloseGroup 可以关闭分组,转换为正常的聚合操作,即 GroupedAggregationSet 到 RedisAggregationSet 的一个转换。

  public static RedisAggregationSet<T> CloseGroup<T>(this GroupedAggregationSet<T> source)

  {

  return new RedisAggregationSet<T>(source, source.Expression);

  }

  结尾

  本文只是对 Redis OM .NET 用法的简单梳理和可用性验证。

标签:OM,FirstName,Redis,customers,RecordShell,var,NET
来源: https://www.cnblogs.com/xsrw/p/15781151.html