ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis OM .NET Redis对象映射框架

2022-01-09 16:03:30  阅读:229  来源: 互联网

标签:OM FirstName Redis customers RecordShell var NET


  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有