介绍Oedis - Redis OH/RM
作死造轮子
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。
项目地址
简易安装
在项目中使用 Nuget 引用:
Install-Package Oedis
Oedis 需要 StackExchange.Redis 作为 Redis 驱动。
用于 Oedis 的 POCO 类
Oedis 的 POCO 类可以与 Entity Framework 一同使用。只需要使用 [Master] 标注主属性,[Reference] 标注参考属性,将需要排除在外的属性使用 [Except] 标记。
如果我们需要创建一个 Report 类,那么可以像这样:
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; }
}
你可能发现我们是不支持导航属性的。直言不讳,确实没做这个功能。如果你需要的话或许可以考虑一起实现?
配置 Oedis 上下文
没啥说的,参考 Entity Framework 就好了:
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()
});
移除一个对象
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));
当前需要注意的信息
- Oedis 不支持多主属性,至少现在不支持,你或许可以换个方案?
- Oedis 将会直接向你的 Redis 数据库中插入数据,所以希望你提供的属性至少都能被转换为 String 类型,或者你可以考虑写一个 ToString() 的方法?
- 当前版本的 Odeis 只能设置一个参考属性。如果你设定了多个,可能某些属性会被忽略。
- 用于判定的 Lambda 表达式当前是受限的,暂时请不要撰写复杂表达式。
性能表现:


跑成绩的时候0.1和0.2版本混杂了...可能有出入,不过表现出来的成绩应该是差不多的(或许更快,StackExchange.Redis的速度要比Sider快不少)。
介绍Oedis - Redis OH/RM的更多相关文章
- Redis的RDB与AOF介绍(Redis DateBase与Append Only File)
RedisRDB介绍(Redis DateBase) 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里 一.是什么? Redis会 ...
- 新书介绍 -- 《Redis核心原理与实践》
大家好,今天给大家介绍一下我的新书 -- <Redis核心原理与实践>. 后端开发的同学应该对Redis都不陌生,Redis由于性能极高.功能强大,已成为业界非常流行的内存数据库. < ...
- 介绍一个Redis的WEB 客户端
http://webd.is/ $ git clone git://github.com/nicolasff/webdis.git $ cd webdis$ make$ ...
- 第四节:Geo类型介绍以及Redis批量操作、事务、分布式锁
一. Geo类型 1. 类型说明 Geo 是 Redis 3.2 版本后新增的数据类型,用来保存兴趣点(POI,point of interest)的坐标信息.可以实现计算两 POI 之间的距离.获取 ...
- 1-NoSQL介绍及Redis安装
背景 随着互联网的不断发展和软件架构的不断复杂化,同时随着网站访问量的日渐上升,导致传统单机关系型数据库应用已经无法满足人们的需求,在高并发的场景下,频繁的数据库存取操作使得服务器压力剧增,甚至导致服 ...
- windows平台下redis安装及配置文件介绍
1.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...
- Redis使用介绍
Redis 是一个高性能的key-value数据库. redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用.它提供了Pyth ...
- Redis Cluster架构和设计机制简单介绍
之前另一篇文章也介绍了 Redis Cluster (link,在文章的后半部分) 今天看到这一篇,简单说一下(http://hot66hot.iteye.com/blog/2050676) 作者的目 ...
- 【redis】01Redis的介绍与安装部署
单元目标: 1.NoSQL介绍 2.Redis的介绍 3.Redis适用场合 4.Redis的安装与部署 5.Redis的数据类型 6.Redis的常用命令 7.Redis的高级应用 通过 ...
随机推荐
- poj -- 1042 Gone Fishing(枚举+贪心)
题意: John现有h个小时的空闲时间,他打算去钓鱼.钓鱼的地方共有n个湖,所有的湖沿着一条单向路顺序排列(John每在一个湖钓完鱼后,他只能走到下一个湖继续钓),John必须从1号湖开始钓起,但是他 ...
- ASP.NET中的XML和JSON
一.DOM简介 1.XML 定义:XML是一种跨语言.跨平台的数据储存格式 2.什么是DOM DOM(document object model)文档对象模型:是一种允许程序或脚本动态的访问更新文档内 ...
- netty学习
1.不选择java原生nio的原因 (1)nio的类库和api繁杂 (2)需要具备其他的额外的技能做铺垫,例如熟悉java多线程编程. (3)可靠性能力补齐的工作量和难度都非常大,例如客户 ...
- APP审核被拒,原因总结
今天早上,突然看到上周末提交的APP,审核被拒了.原以为是因为IPV6审核没过,后来查看原因后发现是,app的3张展示图里面,有些内容显示的有:测试XX等字眼.苹果说提交的版本不能是含有 test,t ...
- Qt 5.7设置调试器
mingw版本下自带的,这个我就不在赘述. 现在来说一下msvc版本下调试器,cdb,这个需要到ms去下载. thunder://QUFodHRwOi8vZG93bmxvYWQubWljcm9zb2Z ...
- 移动App崩溃的测试用例设计
我们的日常生活中对移动设备越来越多的使用意味着移动App测试这个主题已成为需要考虑的一个无法避免的问题.根据最近的调查研究,用户难以容忍有bug的移动App. 移动App Bug的影响是用户体验差.A ...
- VMware克隆虚拟机,克隆机网卡启动不了解决方案
Shutting down loopback interface: [ OK ] Bringing up loopback interface: [ OK ] Bringing up interfac ...
- Devexpress 汉化
DevExpress是一个比较有名的界面控件套件,提供了一系列的界面控件套件的DotNet界面控件.对于较老的版本(例如之前项目中遇到的dev9),对于汉化(应该说本地化Localization)支持 ...
- 使用doxygen制作C代码文档
使用doxygen制作C代码文档 C 代码注释风格约定 行间注释 /*! * * 这里是注释 * */ 行内注释 <code here> /*! 这里是注释 */ doxygen 风格的宏 ...
- 超级编辑器--VIM的常见操作
如下,都是我常用的 删除单词: d + w 关闭vim窗口: :q 或者 shift + zz 全部向左移: shift + v ---> shift + < ---&g ...