基于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":,"CustomerID":"RICSU","EmployeeID":,"OrderDate":"1996-07-12T00:00:00","RequiredDate":"1996-08-09T00:00:00","ShippedDate":"1996-07-15T00:00:00","ShipVia":,"Freight":148.33,"ShipName":"Richter Supermarkt","ShipAddress":"Starenweg 5","ShipCity":"Genève","ShipPostalCode":"","ShipCountry":"Switzerland"}
- Beetlex
await RedisDB.Set(item.OrderID.ToString(), item);
await RedisDB.Get<Order>(i.ToString());
- StackExchange
await RedisDB.StringSetAsync(item.OrderID.ToString(), Newtonsoft.Json.JsonConvert.SerializeObject(item));
var data = await RedisDB.StringGetAsync(i.ToString());
var item = Newtonsoft.Json.JsonConvert.DeserializeObject<Northwind.Data.Order>(data);
- 测试结果
-------------------------------------------------------------------------------
|Name | Round| Threads| Count| Use time(s)| Sec|
-------------------------------------------------------------------------------
|BeetleX_SET | | | | 5.22| |
-------------------------------------------------------------------------------
|StackExchange_SET | | | | 6.97| |
-------------------------------------------------------------------------------
|StackExchange_Sync_SET | | | | 6.62| |
-------------------------------------------------------------------------------
|BeetleX_GET | | | | 5.41| |
-------------------------------------------------------------------------------
|StackExchange_GET | | | | 7.48| |
-------------------------------------------------------------------------------
|StackExchange_Sync_GET | | | | 7.09| |
-------------------------------------------------------------------------------
|BeetleX_MGET | | | | 7.03| |
-------------------------------------------------------------------------------
|StackExchange_MGET | | | | 8.69| |
-------------------------------------------------------------------------------
|StackExchange_Sync_MGET | | | | 8.36| |
-------------------------------------------------------------------------------
|BeetleX_SET | | | | 2.55| |
-------------------------------------------------------------------------------
|StackExchange_SET | | | | 3.97| |
-------------------------------------------------------------------------------
|StackExchange_Sync_SET | | | | 3.56| |
-------------------------------------------------------------------------------
|BeetleX_GET | | | | 2.78| |
-------------------------------------------------------------------------------
|StackExchange_GET | | | | 4.1| |
-------------------------------------------------------------------------------
|StackExchange_Sync_GET | | | | 3.72| |
-------------------------------------------------------------------------------
|BeetleX_MGET | | | | 3.59| |
-------------------------------------------------------------------------------
|StackExchange_MGET | | | | 4.75| |
-------------------------------------------------------------------------------
|StackExchange_Sync_MGET | | | | 4.55| |
-------------------------------------------------------------------------------
|BeetleX_SET | | | | 2.04| |
-------------------------------------------------------------------------------
|StackExchange_SET | | | | 2.37| |
-------------------------------------------------------------------------------
|StackExchange_Sync_SET | | | | 2.15| |
-------------------------------------------------------------------------------
|BeetleX_GET | | | | 2.14| |
-------------------------------------------------------------------------------
|StackExchange_GET | | | | 2.58| |
-------------------------------------------------------------------------------
|StackExchange_Sync_GET | | | | 2.24| |
-------------------------------------------------------------------------------
|BeetleX_MGET | | | | 2.49| |
-------------------------------------------------------------------------------
|StackExchange_MGET | | | | 3.06| |
-------------------------------------------------------------------------------
|StackExchange_Sync_MGET | | | | 2.76| |
-------------------------------------------------------------------------------
组件使用
组件默认就支持数据对象操作,而数据存储的格式则由相应创建的DB数据类型决定,所以在使用和处理数据上都比较方便。
创建数据库
RedisDB DB = new RedisDB();
DB.AddWriteHost("192.168.2.19");
// set password
DB.AddWriteHost("192.168.2.19").Password="";
Json 数据库
RedisDB DB = new RedisDB(, new JsonFormater());
Protobuf 数据库
RedisDB DB = new RedisDB(, new ProtobufFormater());
基础操作
await DB.Decr("mykey")
await DB.Decrby("mykey", );
await DB.Del("mykey");
await DB.Dump("mykey");
await DB.Exists("mykey", "order");
await DB.Expire("mykey", );
await DB.Expireat("mykey", );
await DB.Get<string>("mykey");
await DB.GetBit("mykey", );
await DB.GetRange("mykey", -, -);
await DB.GetSet<string>("mycounter", );
await DB.Incr("mykey");
await DB.Incrby("mykey", );
await DB.IncrbyFloat("mykey", 0.1f);
await DB.Keys("t??");
await DB.MGet<string, string>("key1", "key2");
await DB.MGet<string, string, string>("key1", "aaa", "key2");
await DB.MSet(m => m["key1", "hello"]["key2", "world"]);
await DB.MSetNX(m => m["key1", "hello"]["key2", "there"]);
await DB.Move("one", );
await DB.PSetEX("mykey", , "hello");
await DB.Persist("mykey");
await DB.Pexpire("mykey", );
await DB.Pexpireat("mykey", );
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", , false);
await DB.SetEX("mykey", , "hello");
await DB.SetNX("mykey", "hello");
await DB.SetRange("key1", , "redis");
await DB.Strlen("key1");
await DB.Type("key2");
列表操作
创建列表
var list = DB.CreateList<Employee>("employees");
列表操作
await list.BLPop();
await list.BRPop();
await list.BRPopLPush("List2");
await list.Index();
await list.Insert(true, GetEmployee(), GetEmployee());
await list.Len();
await list.Pop();
await list.Push(GetEmployee());
await list.Push(GetEmployee(), GetEmployee());
await myotherlist.PushX(GetEmployee());
await list.Rem(-, GetEmployee());
await list.Set(-, GetEmployee());
await list.Trim(, -);
await list.RPop();
await list.RPopLPush("myotherlist");
await list.RPush(GetEmployee());
await list.RPush(GetEmployee(), GetEmployee());
await list.RPushX(GetEmployee());
await list.Range(-, );
HashTable结构
创建
var table = DB.CreateHashTable("myhash");
相关操作
await table.Del("emp1");
await table.Exists("emp1");
await table.Get<Employee>("emp1");
await table.Keys();
await table.Len();
await table.Get<Employee, Order>("emp", "order");
await table.Get<Employee, Order, Customer>("emp", "order", "customer");
await table.MSet(m => m["field1", GetEmployee()]["field2", GetCustomer()]);
await table.Set("field1", GetEmployee());
await table.SetNX("field", GetEmployee());
订阅
创建订阅
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
基于async/non-blocking高性能redis组件库BeetleX.Redis的更多相关文章
- 基于Svelte3.x桌面端UI组件库Svelte UI
Svelte-UI,一套基于svelte.js开发的桌面pc端ui组件库 最近一直忙于写svelte-ui,一套svelte3开发的桌面端ui组件库.在设计及功能上借鉴了element-ui组件库.所 ...
- 【xingorg1-ui】基于vue3.0从0-1搭建组件库(一)环境配置与目录规划
npm地址 github源码 开篇-环境配置 环境配置: 使用vue-cli搭建项目框架,需要用vue3的话,得先把vue-cli的版本升级到vue-cli@5以上 npm install -g @v ...
- 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多
通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...
- RSuite 一个基于 React.js 的 Web 组件库
RSuite http://rsuite.github.io RSuite 是一个基于 React.js 开发的 Web 组件库,参考 Bootstrap 设计,提供其中常用组件,支持响应式布局. 我 ...
- 基于Vue的npm组件库
前言(*❦ω❦) 思维导图可能有点高糊,有点太大了,项目和导图文件放到github或giteee上,这个思维导图也是我文章的架构,思维导图是用FeHelper插件生成的,这个是一款开源chrome插件 ...
- 前端组件库 - 搭建web app常用的样式/组件等收集列表(移动优先)
0. 前端自动化(Workflow) 前端构建工具 Webpack - module bundler Yeoman - a set of tools for automating developmen ...
- 16款优秀的Vue UI组件库推荐
16款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基 ...
- Vue2.0+组件库总结
转自:https://blog.csdn.net/lishanleilixin/article/details/84025459 UI组件 element - 饿了么出品的Vue2的web UI工具套 ...
- 转:Vue2.0+组件库总结
UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...
随机推荐
- C# 使用SmtpClient发送Email
使用Winfrom写的报错信息发送邮件通知. 以下主要代码 /// <summary> /// 发送邮件核心代码 /// </summary> /// <param na ...
- Reactor三种线程模型与Netty线程模型
文中所讲基本都是以非阻塞IO.异步IO为基础.对于阻塞式IO,下面的编程模型几乎都不适用 Reactor三种线程模型 单线程模型 单个线程以非阻塞IO或事件IO处理所有IO事件,包括连接.读.写.异常 ...
- Python3实现ICMP远控后门(中)之“嗅探”黑科技
ICMP后门 前言 第一篇:Python3实现ICMP远控后门(上) 第二篇:Python3实现ICMP远控后门(上)_补充篇 在上两篇文章中,详细讲解了ICMP协议,同时实现了一个具备完整功能的pi ...
- pycharm的安装及用法
俗话说的好:"工欲善其事,必先利其器",程序员写代码,肯定不能在编译器里面写,这有一个全宇宙最好的python编译器,叫做pycharm ,他的优点呢,大家可以看一下: 优点:1, ...
- map和set的原理
1)map:经过排序了的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的) 是在排序或搜索时使用,它的值可以在容器中重新获取:而另一个值是该元素关联 ...
- 数码相框(LCD、I2C)
一:项目介绍 该项目最终实现的功能很简单,手指在触摸屏左滑(下一张图片),右滑(上一张图片) 1.1软硬件资源 硬件:pc机,ARM Cortex-A9开发板 软件:linux ...
- SSM-MyBatis-11:Mybatis中查询全部用resultmap
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类很普通,四个字段,编号,名字,作者名,价格 在接口中的方法声明如下 //查全部 public List& ...
- PiggyMetrics windows 部署
PiggyMetrics 是springcloud的demo,其特性就不细说了,主要描述在win10下部署的坑. 官网是:https://github.com/sqshq/PiggyMetrics 官 ...
- MySQL(二)MySQL的安装和简单使用
1.MySQL产品的介绍 MySQL数据库属于MySQL AB公司,总部位于瑞典,后被Oracle收购. 优点: (1)成本低:开放源代码,可以免费使用 (2)性能高:执行很快 (2)简单:很容易安装 ...
- 关于maven的配置使用 这一篇还比较全 2017.12.13
https://www.cnblogs.com/tangshengwei/p/6341462.html