Redis OM .NET Redis对象映射框架
2022/1/9 19:04:05
本文主要是介绍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 用法的简单梳理和可用性验证。
这篇关于Redis OM .NET Redis对象映射框架的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#