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快很多)。