c# – 使用Redis,密钥或Id存储对象标识符?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用Redis,密钥或Id存储对象标识符?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3135字,纯文字阅读大概需要5分钟。
内容图文
![c# – 使用Redis,密钥或Id存储对象标识符?](/upload/InfoBanner/zyjiaocheng/902/43fe248f00174014bcba51cbd046b39f.jpg)
我有(几乎)我的应用程序中的所有POCO类的主基类.
public abstract class AceOfBase
{
public long Id { get; set; }
public DateTimeOffset CreatedOn { get; set; }
public string Key { get; set; }
}
我的一些主要课程(会员,建筑,社区等)拥有相当数量的属性
我计划利用ServiceStack’s Strongly-Typed Client提供的简易管理.
From the research I’ve done似乎客户端使用结构化方法来创建密钥
Essentially POCOs gets stored into Redis as serialized JSON with both the typeof(Poco).Name and the Id used to form a unique key for that instance. E.g:
urn:Poco:{Id} => ‘{“Id”:1,”Foo”:”Bar”}’
因为有时我会检索一个继承基类的对象(但我不知道编译时的派生类)如何才能最好地存储密钥以便我可以轻松获取任何对象?
一个理想的世界,我可以配置RedisClient和RedisTypedClient使用相同的键命名约定,但我还没有找到任何可以让我这样做(还),并且很难为两个客户提供有关各个方法的文档.
解决方法:
在挖掘ServiceStack程序集后,我发现强类型客户端的Store()方法实际上只是SetEntry(key,value),其实用方法用于生成密钥结构.
实用程序方法IdUtils.CreateUrn有一些重载,允许您指定Type和Id,然后返回用作键的字符串.
那么,我所做的就是在我的Repository基类中编写一个CreateKey方法,然后在创建任何AceOfBase对象时将其调用并将其设置为Key.
//In BaseRepository
public virtual string CreateKey<T>(T entity) where T : AceOfBase
{
return IdUtils.CreateUrn<AceOfBase>(entity.Id);
}
//In MemberRepository
Member m = new Member(); //inherits from AceOfBase
m.Key = CreateKey(m);
我在我的应用程序中也实现了两组类,这些帮助我利用Redis疯狂的快速查询时间,同时允许我像EF一样正常使用关系.
> DomainModels – 它们看起来像普通类,因为它们的属性是传统的结构.
public class Activity : AceOfBase
{
public AceOfBase IndirectObject { get; set; }
public Participant Predicate { get; set; }
public Participant Subject { get; set; }
public Verb Verb { get; set; }
}
> DataModels – 它们包含与DomainModel对应物相同的原语和枚举,但如果字段是存储在Redis中的自定义类型,则它将替换为表示该对象的键的字符串(具有相同的属性名称).
public class Activity : AceOfBase
{
public string IndirectObject { get; set; }
public string Predicate { get; set; }
public string Subject { get; set; }
public Verb Verb { get; set; }
}
我已经使用一组自定义TypeConverter类实现了AutoMapper,它们将DataModel字符串属性转换为DomainModel中具有相同名称的相应属性.然后在存储任何对象之前以及从Redis中提取对象并在两种模型类型之间进行转换之后立即调用AutoMapper.
//In Configure()
Mapper.CreateMap<string,Member>().ConvertUsing<KeyToBaseConverter<Member>>();
Mapper.CreateMap<Member, string>().ConvertUsing<BaseToKeyConverter<Member>>();
public class KeyToBaseConverter<T> : ITypeConverter<string, T> where T : AceOfBase
{
public RedisRepository Repository { get; set; }
public T Convert(ResolutionContext context)
{
return Repository.GetByKey<T>(context.SourceValue.ToString());
}
}
public class BaseToKeyConverter<T> : ITypeConverter<T, string> where T : AceOfBase
{
public string Convert(ResolutionContext context)
{
var f = context.SourceValue as AceOfBase;
return f.Key;
}
}
剩下要解决的唯一问题是确保我创建的任何列表或集合都能获得与其键相同的格式.
使用此模式,我将能够在字符串客户端旁边无缝地使用强类型客户端,确保即使在没有强类型客户端的情况下拉动对象,我也可以通过仅检查来确定并安全地将JSON blob转换为正确的类型重要财产.
内容总结
以上是互联网集市为您收集整理的c# – 使用Redis,密钥或Id存储对象标识符?全部内容,希望文章能够帮你解决c# – 使用Redis,密钥或Id存储对象标识符?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。