Oedis是近段时间为了解决日志型数据如何与Entity Framework的查询整合的问题写的一个Redis的OH /RM。虽然Redis出来蛮久了,各路高手也都提出了实践方案,可是或许是由于Redis自己不须要OH/RM的缘由(毕竟NoSQL),因此一开始压根没找到...这就很尴尬了。
因为日志也是一个类,而且保持持续增加,预估400K/d,继续用SQL Server的话感受有点不大对,因此转向Redis,可是要往Redis里存储数据须要自行设计一系列而后撰写一次性代码...自打写完很多有违设计模式的项目就以为重复代码很恶心,因此但愿能经过一套框架(或者说一套代码)将数据自动解析并存储到Redis,查询的时候也能正确序列化回来。
因为真的找不到相似的东西,因此就本身造轮子了...Oedis在底层使用了很多反射还有程序集方法,本身想着都以为效率有点坑...不过仍是能知足自身需求和目标的。在数据库链接上试了几个后选择了StackExchange.Redis驱动,一开始选择的是很是轻量的Sider,不过用起来彷佛遇到了些有趣的问题...因此就转到了StackExchange.Redis。
因为这只是一个解决整合EF与Redis和当前代码问题的解决方案,因此若是要求极致性能,还请使用直接操纵Redis的方法。
一开始准备实现IQueryable,结果发现有些繁琐...也发现这也不须要生成SQL而且Redis也不是关系型数据库,检索原本就是受限的,因此就用表达式树来处理Where的predicate。数据库
在Github上托管的公共版本设计模式
在项目中使用 Nuget 引用:app
Install-Package Oedis
Oedis 须要 StackExchange.Redis 做为 Redis 驱动。框架
Oedis 的 POCO 类能够与 Entity Framework 一同使用。只须要使用 [Master]
标注主属性,[Reference]
标注参考属性,将须要排除在外的属性使用 [Except]
标记。
若是咱们须要建立一个 Report
类,那么能够像这样:ide
public class Report { [Master] [Key] public Int32 Id { get; set;} [Reference] [NotMapped] public Guid Case_Id { get; set; } [Except] public virtual Case Case { get; set;} public String Context { get; set; } }
你可能发现咱们是不支持导航属性的。直言不讳,确实没作这个功能。若是你须要的话或许能够考虑一块儿实现?性能
没啥说的,参考 Entity Framework 就行了:ui
class OedisContext : Oedis.OedisContext { public OedisContext() : base() { } public RedisSet<Report> Reports { get; set; } }
建立上下文对象设计
var OS = new OedisContext();
插入一个对象日志
OS.Reports.Add(new Report { Id = 0, Product = "EF", Rid = Guid.NewGuid() });
移除一个对象code
OS.Reports.Remove( OS.Reports.Find(Guid.Parse(guidstr)) );
移除不少对象
OS.Reports.Remove(OS.Reports .Where(x=>x.Rid==new Guid(guidstr)));
上面的写法是清空一个引用属性对应的全部对象,不推荐那样的写法,建议:
OS.Reports .Clear(x=>x.Rid==new Guid(guidstr));
跑成绩的时候0.1和0.2版本混杂了...可能有出入,不过表现出来的成绩应该是差很少的(或许更快,StackExchange.Redis的速度要比Sider快很多)。