介紹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。數據庫

項目地址

在Github上託管的公共版本設計模式

簡易安裝

在項目中使用 Nuget 引用:app

Install-Package Oedis

Oedis 須要 StackExchange.Redis 做爲 Redis 驅動。框架

用於 Oedis 的 POCO 類

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; }
}

你可能發現咱們是不支持導航屬性的。直言不諱,確實沒作這個功能。若是你須要的話或許能夠考慮一塊兒實現?性能

配置 Oedis 上下文

沒啥說的,參考 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));

當前須要注意的信息

  • Oedis 不支持多主屬性,至少如今不支持,你或許能夠換個方案?
  • Oedis 將會直接向你的 Redis 數據庫中插入數據,因此但願你提供的屬性至少都能被轉換爲 String 類型,或者你能夠考慮寫一個 ToString() 的方法?
  • 當前版本的 Odeis 只能設置一個參考屬性。若是你設定了多個,可能某些屬性會被忽略。
  • 用於斷定的 Lambda 表達式當前是受限的,暫時請不要撰寫複雜表達式。

性能表現:


跑成績的時候0.1和0.2版本混雜了...可能有出入,不過表現出來的成績應該是差很少的(或許更快,StackExchange.Redis的速度要比Sider快很多)。

相關文章
相關標籤/搜索