基於async/non-blocking高效能redis元件庫BeetleX.Redis
基於async/non-blocking高效能redis元件庫BeetleX.Redis
BeetleX.Redis是基於async/non-blocking模式實現的高效能redis元件庫,元件支援redis基礎指令集,並封裝更簡便的List,Hashset和Subscribe操作。除了在基礎操作功能上,元件還提供多服務備份方式和多連線池機制,從而讓元件提供高可用和高效能的訪問方案;在資料格式上元件預設整合了json和protobuf可以根據自己的需求來選擇相應的儲存格式。接下來大概看一下元件的效能和應用功能。
效能
針對Order結構進行一個GET/SET效能測試,分別測試BeetleX和StackExchange在這兩個操作下不同執行緒的壓測,由於在8以上執行緒數測試StackExchange經常拋timeout錯誤....,所以只測了1,2和4執行緒情況。詳細測試程式碼:https://github.com/IKende/BeetleX.Redis/tree/master/PerformanceTest(程式碼裡整合了一個輕巧的效能測試功能類,用起來非常方便,只需要簡單編寫測試用例就可以列表出測試時間和併發等相關資料,以下測試結果列表由這個測試類輸出。)
測試資料結構
{"OrderID":10255,"CustomerID":"RICSU","EmployeeID":9,"OrderDate":"1996-07-12T00:00:00","RequiredDate":"1996-08-09T00:00:00","ShippedDate":"1996-07-15T00:00:00","ShipVia":3,"Freight":148.33,"ShipName":"Richter Supermarkt","ShipAddress":"Starenweg 5","ShipCity":"Genève","ShipPostalCode":"1204","ShipCountry":"Switzerland"}
Beetlex
1 await RedisDB.Set(item.OrderID.ToString(), item);
2 await RedisDB.Get(i.ToString());
StackExchange
1 await RedisDB.StringSetAsync(item.OrderID.ToString(), Newtonsoft.Json.JsonConvert.SerializeObject(item));
2 var data = await RedisDB.StringGetAsync(i.ToString());
3 var item = Newtonsoft.Json.JsonConvert.DeserializeObject(data);
測試結果
複製程式碼
|Name | Round| Threads| Count| Use time(s)| Sec|
|BeetleX_SET | 1| 1| 100000| 5.22| 19157|
|StackExchange_SET | 1| 1| 100000| 6.97| 14357|
|StackExchange_Sync_SET | 1| 1| 100000| 6.62| 15103|
|BeetleX_GET | 1| 1| 100000| 5.41| 18487|
|StackExchange_GET | 1| 1| 100000| 7.48| 13378|
|StackExchange_Sync_GET | 1| 1| 100000| 7.09| 14105|
|BeetleX_MGET | 1| 1| 100000| 7.03| 14216|
|StackExchange_MGET | 1| 1| 100000| 8.69| 11504|
|StackExchange_Sync_MGET | 1| 1| 100000| 8.36| 11963|
|BeetleX_SET | 1| 2| 100000| 2.55| 39246|
|StackExchange_SET | 1| 2| 100000| 3.97| 25199|
|StackExchange_Sync_SET | 1| 2| 100000| 3.56| 28069|
|BeetleX_GET | 1| 2| 100000| 2.78| 35946|
|StackExchange_GET | 1| 2| 100000| 4.1| 24364|
|StackExchange_Sync_GET | 1| 2| 100000| 3.72| 26907|
|BeetleX_MGET | 1| 2| 100000| 3.59| 27871|
|StackExchange_MGET | 1| 2| 100000| 4.75| 21035|
|StackExchange_Sync_MGET | 1| 2| 100000| 4.55| 21976|
|BeetleX_SET | 1| 4| 100000| 2.04| 48956|
|StackExchange_SET | 1| 4| 100000| 2.37| 42220|
|StackExchange_Sync_SET | 1| 4| 100000| 2.15| 46541|
|BeetleX_GET | 1| 4| 100000| 2.14| 46822|
|StackExchange_GET | 1| 4| 100000| 2.58| 38789|
|StackExchange_Sync_GET | 1| 4| 100000| 2.24| 44619|
|BeetleX_MGET | 1| 4| 100000| 2.49| 40238|
|StackExchange_MGET | 1| 4| 100000| 3.06| 32708|
|StackExchange_Sync_MGET | 1| 4| 100000| 2.76| 36264|
複製程式碼
元件使用
元件預設就支援資料物件操作,而資料儲存的格式則由相應建立的DB資料型別決定,所以在使用和處理資料上都比較方便。
建立資料庫
RedisDB DB = new RedisDB();
DB.AddWriteHost("192.168.2.19");
// set password
DB.AddWriteHost("192.168.2.19").Password="123456";
Json 資料庫
RedisDB DB = new RedisDB(0, new JsonFormater());
Protobuf 資料庫
RedisDB DB = new RedisDB(0, new ProtobufFormater());
基礎操作
複製程式碼
await DB.Decr("mykey")
await DB.Decrby("mykey", 5);
await DB.Del("mykey");
await DB.Dump("mykey");
await DB.Exists("mykey", "order");
await DB.Expire("mykey", 10);
await DB.Expireat("mykey", 1293840000);
await DB.Get("mykey");
await DB.GetBit("mykey", 0);
await DB.GetRange("mykey", -3, -1);
await DB.GetSet("mycounter", 0);
await DB.Incr("mykey");
await DB.Incrby("mykey", 10);
await DB.IncrbyFloat("mykey", 0.1f);
await DB.Keys("t??");
await DB.MGet("key1", "key2");
await DB.MGet("key1", "aaa", "key2");
await DB.MSet(m => m"key1", "hello");
await DB.MSetNX(m => m"key1", "hello");
await DB.Move("one", 9);
await DB.PSetEX("mykey", 1000, "hello");
await DB.Persist("mykey");
await DB.Pexpire("mykey", 1500);
await DB.Pexpireat("mykey", 1555555555005);
await DB.Ping();
await DB.PTtl("mykey");
await DB.Randomkey();
await DB.Rename("mykey", "myotherkey");
await DB.Renamenx("mykey", "myotherkey");
await DB.Set("test", "henryfan");
await DB.SetBit("mykey", 7, false);
await DB.SetEX("mykey", 10, "hello");
await DB.SetNX("mykey", "hello");
await DB.SetRange("key1", 6, "redis");
await DB.Strlen("key1");
await DB.Type("key2");
複製程式碼
列表操作
建立列表
var list = DB.CreateList("employees");
列表操作
複製程式碼
await list.BLPop();
await list.BRPop();
await list.BRPopLPush("List2");
await list.Index(0);
await list.Insert(true, GetEmployee(2), GetEmployee(3));
await list.Len();
await list.Pop();
await list.Push(GetEmployee(1));
await list.Push(GetEmployee(1), GetEmployee(2));
await myotherlist.PushX(GetEmployee(2));
await list.Rem(-2, GetEmployee(1));
await list.Set(-2, GetEmployee(5));
await list.Trim(1, -1);
await list.RPop();
await list.RPopLPush("myotherlist");
await list.RPush(GetEmployee(3));
await list.RPush(GetEmployee(1), GetEmployee(2));
await list.RPushX(GetEmployee(2));
await list.Range(-3, 2);
複製程式碼
HashTable結構
建立
var table = DB.CreateHashTable("myhash");
相關操作
複製程式碼
await table.Del("emp1");
await table.Exists("emp1");
await table.Get("emp1");
await table.Keys();
await table.Len();
await table.Get("emp", "order");
await table.Get("emp", "order", "customer");
await table.MSet(m => m"field1", GetEmployee(1));
await table.Set("field1", GetEmployee(1));
await table.SetNX("field", GetEmployee(1));
複製程式碼
訂閱
建立訂閱
複製程式碼
var sub = db.Subscribe();
sub.Register<Employee>("test1");
sub.Receive = (o, e) =>
{
Console.WriteLine($"[{DateTime.Now}]{e.Channel}-{e.Type}:{e.Data}");
};
sub.Listen();
複製程式碼
通過Retister方法註冊訂閱頻道,在註冊的時候必須指定資料型別,物件反序列化的格式依據庫資料的格式型別。
await DB.Publish("test1", GetEmployee(i));
以上是釋出訊息到頻道
總結
以上是BeetleX.Redis現有版本的功能,叢集功能暫沒有實現;但提供主備功能可以根據自己的需要新增多個WriteHost或ReadHost,預設連線池機制隨意應對高併發應用;元件希望打造一個高效能簡便的Redis .net core元件,但要發揮元件的效能特色就要適應完全基於await的方法進行元件操作。 專案開源地址:https://github.com/IKende/BeetleX.Redis
原文地址https://www.cnblogs.com/smark/p/10639573.html
相關文章
- 基於Vue的Qabler元件庫Vue元件
- 如何基於 Redis 構建應用程式元件Redis元件
- 基於Vue搭建自己的元件庫(1)Vue元件
- 基於 Stencil 構建 Web Components 元件庫Web元件
- uiw 1.2.16 釋出,基於 React 16 的元件庫UIReact元件
- uiw 1.2.14 釋出,基於 React 16 的元件庫UIReact元件
- QFluentWidgets: 基於 C++ Qt 的 Fluent Design 元件庫C++QT元件
- uiw 1.2.15 釋出,基於 React 16 的元件庫UIReact元件
- Mand Mobile - 基於金融場景的Vuejs元件庫VueJS元件
- Redis基礎篇(二)高效能IO模型Redis模型
- 基於CocoaPods的元件化原理及私有庫實踐元件化
- vue-calendar 基於 vue 2.0 開發的輕量,高效能日曆元件Vue元件
- 在openresty上基於是lock和redis快速搭建高效能long polling推送服務RESTRedis
- ve-plus:基於 vue3.x 桌面端UI元件庫|vue3元件庫VueUI元件
- 如何開發一個基於 Vue 的 ui 元件庫(一)VueUI元件
- 如何開發一個基於 Vue 的 ui 元件庫(二)VueUI元件
- Element 2.7.2 釋出,基於 Vue 2.0 的桌面端元件庫Vue元件
- 基於 React 的 UI 元件庫 uiw v1.2.10 釋出ReactUI元件
- 使用webpack4搭建一個基於Vue的元件庫WebVue元件
- 基於TDesign風格的Blazor企業級UI元件庫BlazorUI元件
- 基於Svelte3.x桌面端UI元件庫Svelte UIUI元件
- 【Redis】基於consul的Redis高可用方案Redis
- 基於資料庫、redis和zookeeper實現的分散式鎖資料庫Redis分散式
- 基於 Redis 分散式鎖Redis分散式
- 一個高效能的 Vue 高德地圖元件庫Vue地圖元件
- iView:一套基於Vue的高質量UI元件庫ViewVueUI元件
- 從零到一教你基於vue開發一個元件庫Vue元件
- 基於canvas實現的高效能、跨平臺的股票圖表庫--clchartCanvas
- 基於mpvue的toast元件VueAST元件
- JkdYaf - 基於 YAF + SWOOLE 高效能API框架API框架
- Redis基礎(二)資料庫Redis資料庫
- 【資料庫】Redis基礎篇資料庫Redis
- 關於移動端元件庫元件
- 如何快速為團隊打造自己的元件庫(下)—— 基於 element-ui 為團隊打造自己的元件庫元件UI
- .Net 下高效能分表分庫元件-連線模式原理元件模式
- fish-ui 一套基於vue2的ui元件庫UIVue元件
- Yoshino: 一個基於React的可定製化的PC元件庫React元件
- 基於redis的分散式鎖Redis分散式