zoukankan      html  css  js  c++  java
  • 介绍Oedis

    作死造轮子

    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 引用:

    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快不少)。

  • 相关阅读:
    react萌新的读书笔记(一)
    python 读取目录下的文件
    scrapy爬虫入门
    iPad和iPhone如何保护自己的隐私?
    郭盛华动真格了!新公司获百亿融资,网友:还招人不
    僵尸网络瞄准Linux服务器
    中美黑客谁更强?揭秘郭盛华与凯文的传奇故事
    VMware新致命漏洞,黑客可远程控制你的系统
    中国两大网络守护神,为祖国默默付出着,向他们致敬!
    Web应用程序已成为黑客的首要目标
  • 原文地址:https://www.cnblogs.com/johnwii/p/5811849.html
Copyright © 2011-2022 走看看