BeetleX.Redis是基于async/non-blocking模式实现的高性能redis组件库,组件支持redis基础指令集,并封装更简便的List,HashsetSubscribe操作。除了在基础操作功能上,组件还提供多服务备份方式和多连接池机制,从而让组件提供高可用和高性能的访问方案;在数据格式上组件默认集成了jsonprotobuf可以根据自己的需求来选择相应的存储格式。接下来大概看一下组件的性能和应用功能。

性能

针对Order结构进行一个GET/SET性能测试,分别测试BeetleXStackExchange在这两个操作下不同线程的压测,由于在8以上线程数测试StackExchange经常抛timeout错误....,所以只测了1,2和4线程情况。详细测试代码:https://github.com/IKende/BeetleX.Redis/tree/master/PerformanceTest(代码里集成了一个轻巧的性能测试功能类,用起来非常方便,只需要简单编写测试用例就可以列表出测试时间和并发等相关数据,以下测试结果列表由这个测试类输出。)

  • 测试数据结构
  1. {"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
  1. await RedisDB.Set(item.OrderID.ToString(), item);
  2. await RedisDB.Get<Order>(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<Northwind.Data.Order>(data);
  • 测试结果
  1. -------------------------------------------------------------------------------
  2. |Name | Round| Threads| Count| Use time(s)| Sec|
  3. -------------------------------------------------------------------------------
  4. |BeetleX_SET | | | | 5.22| |
  5. -------------------------------------------------------------------------------
  6. |StackExchange_SET | | | | 6.97| |
  7. -------------------------------------------------------------------------------
  8. |StackExchange_Sync_SET | | | | 6.62| |
  9. -------------------------------------------------------------------------------
  10. |BeetleX_GET | | | | 5.41| |
  11. -------------------------------------------------------------------------------
  12. |StackExchange_GET | | | | 7.48| |
  13. -------------------------------------------------------------------------------
  14. |StackExchange_Sync_GET | | | | 7.09| |
  15. -------------------------------------------------------------------------------
  16. |BeetleX_MGET | | | | 7.03| |
  17. -------------------------------------------------------------------------------
  18. |StackExchange_MGET | | | | 8.69| |
  19. -------------------------------------------------------------------------------
  20. |StackExchange_Sync_MGET | | | | 8.36| |
  21. -------------------------------------------------------------------------------
  22. |BeetleX_SET | | | | 2.55| |
  23. -------------------------------------------------------------------------------
  24. |StackExchange_SET | | | | 3.97| |
  25. -------------------------------------------------------------------------------
  26. |StackExchange_Sync_SET | | | | 3.56| |
  27. -------------------------------------------------------------------------------
  28. |BeetleX_GET | | | | 2.78| |
  29. -------------------------------------------------------------------------------
  30. |StackExchange_GET | | | | 4.1| |
  31. -------------------------------------------------------------------------------
  32. |StackExchange_Sync_GET | | | | 3.72| |
  33. -------------------------------------------------------------------------------
  34. |BeetleX_MGET | | | | 3.59| |
  35. -------------------------------------------------------------------------------
  36. |StackExchange_MGET | | | | 4.75| |
  37. -------------------------------------------------------------------------------
  38. |StackExchange_Sync_MGET | | | | 4.55| |
  39. -------------------------------------------------------------------------------
  40. |BeetleX_SET | | | | 2.04| |
  41. -------------------------------------------------------------------------------
  42. |StackExchange_SET | | | | 2.37| |
  43. -------------------------------------------------------------------------------
  44. |StackExchange_Sync_SET | | | | 2.15| |
  45. -------------------------------------------------------------------------------
  46. |BeetleX_GET | | | | 2.14| |
  47. -------------------------------------------------------------------------------
  48. |StackExchange_GET | | | | 2.58| |
  49. -------------------------------------------------------------------------------
  50. |StackExchange_Sync_GET | | | | 2.24| |
  51. -------------------------------------------------------------------------------
  52. |BeetleX_MGET | | | | 2.49| |
  53. -------------------------------------------------------------------------------
  54. |StackExchange_MGET | | | | 3.06| |
  55. -------------------------------------------------------------------------------
  56. |StackExchange_Sync_MGET | | | | 2.76| |
  57. -------------------------------------------------------------------------------

组件使用

组件默认就支持数据对象操作,而数据存储的格式则由相应创建的DB数据类型决定,所以在使用和处理数据上都比较方便。

创建数据库

  1. RedisDB DB = new RedisDB();
  2. DB.AddWriteHost("192.168.2.19");
  3. // set password
  4. DB.AddWriteHost("192.168.2.19").Password="";

Json 数据库

  1. RedisDB DB = new RedisDB(, new JsonFormater());

Protobuf 数据库

  1. RedisDB DB = new RedisDB(, new ProtobufFormater());

基础操作

  1. await DB.Decr("mykey")
  2. await DB.Decrby("mykey", );
  3. await DB.Del("mykey");
  4. await DB.Dump("mykey");
  5. await DB.Exists("mykey", "order");
  6. await DB.Expire("mykey", );
  7. await DB.Expireat("mykey", );
  8. await DB.Get<string>("mykey");
  9. await DB.GetBit("mykey", );
  10. await DB.GetRange("mykey", -, -);
  11. await DB.GetSet<string>("mycounter", );
  12. await DB.Incr("mykey");
  13. await DB.Incrby("mykey", );
  14. await DB.IncrbyFloat("mykey", 0.1f);
  15. await DB.Keys("t??");
  16. await DB.MGet<string, string>("key1", "key2");
  17. await DB.MGet<string, string, string>("key1", "aaa", "key2");
  18. await DB.MSet(m => m["key1", "hello"]["key2", "world"]);
  19. await DB.MSetNX(m => m["key1", "hello"]["key2", "there"]);
  20. await DB.Move("one", );
  21. await DB.PSetEX("mykey", , "hello");
  22. await DB.Persist("mykey");
  23. await DB.Pexpire("mykey", );
  24. await DB.Pexpireat("mykey", );
  25. await DB.Ping();
  26. await DB.PTtl("mykey");
  27. await DB.Randomkey();
  28. await DB.Rename("mykey", "myotherkey");
  29. await DB.Renamenx("mykey", "myotherkey");
  30. await DB.Set("test", "henryfan");
  31. await DB.SetBit("mykey", , false);
  32. await DB.SetEX("mykey", , "hello");
  33. await DB.SetNX("mykey", "hello");
  34. await DB.SetRange("key1", , "redis");
  35. await DB.Strlen("key1");
  36. await DB.Type("key2");

列表操作

创建列表

  1. var list = DB.CreateList<Employee>("employees");

列表操作

  1. await list.BLPop();
  2. await list.BRPop();
  3. await list.BRPopLPush("List2");
  4. await list.Index();
  5. await list.Insert(true, GetEmployee(), GetEmployee());
  6. await list.Len();
  7. await list.Pop();
  8. await list.Push(GetEmployee());
  9. await list.Push(GetEmployee(), GetEmployee());
  10. await myotherlist.PushX(GetEmployee());
  11. await list.Rem(-, GetEmployee());
  12. await list.Set(-, GetEmployee());
  13. await list.Trim(, -);
  14. await list.RPop();
  15. await list.RPopLPush("myotherlist");
  16. await list.RPush(GetEmployee());
  17. await list.RPush(GetEmployee(), GetEmployee());
  18. await list.RPushX(GetEmployee());
  19. await list.Range(-, );

HashTable结构

创建

  1. var table = DB.CreateHashTable("myhash");

相关操作

  1. await table.Del("emp1");
  2. await table.Exists("emp1");
  3. await table.Get<Employee>("emp1");
  4. await table.Keys();
  5. await table.Len();
  6. await table.Get<Employee, Order>("emp", "order");
  7. await table.Get<Employee, Order, Customer>("emp", "order", "customer");
  8. await table.MSet(m => m["field1", GetEmployee()]["field2", GetCustomer()]);
  9. await table.Set("field1", GetEmployee());
  10. await table.SetNX("field", GetEmployee());

订阅

创建订阅

  1. var sub = db.Subscribe();
  2. sub.Register<Employee>("test1");
  3. sub.Receive = (o, e) =>
  4. {
  5. Console.WriteLine($"[{DateTime.Now}]{e.Channel}-{e.Type}:{e.Data}");
  6. };
  7. sub.Listen();

通过Retister方法注册订阅频道,在注册的时候必须指定数据类型,对象反序列化的格式依据库数据的格式类型。

  1. 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的更多相关文章

  1. 基于Svelte3.x桌面端UI组件库Svelte UI

    Svelte-UI,一套基于svelte.js开发的桌面pc端ui组件库 最近一直忙于写svelte-ui,一套svelte3开发的桌面端ui组件库.在设计及功能上借鉴了element-ui组件库.所 ...

  2. 【xingorg1-ui】基于vue3.0从0-1搭建组件库(一)环境配置与目录规划

    npm地址 github源码 开篇-环境配置 环境配置: 使用vue-cli搭建项目框架,需要用vue3的话,得先把vue-cli的版本升级到vue-cli@5以上 npm install -g @v ...

  3. 基于 Vue.js 的移动端组件库mint-ui实现无限滚动加载更多

    通过多次爬坑,发现了这些监听滚动来加载更多的组件的共同点, 因为这些加载更多的方法是绑定在需要加载更多的内容的元素上的, 所以是进入页面则直接触发一次,当监听到滚动事件之后,继续加载更多, 所以对于无 ...

  4. RSuite 一个基于 React.js 的 Web 组件库

    RSuite http://rsuite.github.io RSuite 是一个基于 React.js 开发的 Web 组件库,参考 Bootstrap 设计,提供其中常用组件,支持响应式布局. 我 ...

  5. 基于Vue的npm组件库

    前言(*❦ω❦) 思维导图可能有点高糊,有点太大了,项目和导图文件放到github或giteee上,这个思维导图也是我文章的架构,思维导图是用FeHelper插件生成的,这个是一款开源chrome插件 ...

  6. 前端组件库 - 搭建web app常用的样式/组件等收集列表(移动优先)

    0. 前端自动化(Workflow) 前端构建工具 Webpack - module bundler Yeoman - a set of tools for automating developmen ...

  7. 16款优秀的Vue UI组件库推荐

    16款优秀的Vue UI组件库推荐 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司的Web前端项目开发中,多个项目采用基 ...

  8. Vue2.0+组件库总结

    转自:https://blog.csdn.net/lishanleilixin/article/details/84025459 UI组件 element - 饿了么出品的Vue2的web UI工具套 ...

  9. 转:Vue2.0+组件库总结

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...

随机推荐

  1. C++中遍历读取数组中的元素

    答案来源:https://zhidao.baidu.com/question/187071815.html 对于字符数组str[N],判断方法有以下三种: 第一种:用库函数strlen 1 len = ...

  2. 如何将代码提交到git上

    http://blog.csdn.net/laozitianxia/article/details/50682100 这个博客介绍的很详细.

  3. jQuery的学习笔记2

    jQuery学习笔记 Day two Chapter two 选择器 类选择器 语法结构:$(“.classname”) javascript里面没有类选择器所以这个时候使用jQuery会更加的简便 ...

  4. Oracle VM VirtualBox(一) 快速拷贝一个新的虚拟机

    快速拷贝一个新的虚拟机 一 找到虚拟机vdi文件,复制一份并重命名. 二 修改新虚拟机的UUID 注:不修改创建不了虚拟机,会抛出Oracle VM VirtualBox UUID already e ...

  5. javascript中字符串和字符串变量的问题

    var s = new String("hello"); s.indexOf(1) = 'p'; //错误,indexof()是函数 s[1]='p' //错误,在c和c++可以改 ...

  6. Django中数据库表的关联与创建(语言:python)

    首先选择选用的数据库,(本人选用django(1.11.8版本)) 在主项目settings中操作如下: DATABASES = { 'default': { 'ENGINE': 'django.db ...

  7. 原生aspx页面如何引用公共js和css

    项目过程中遇到一个问题,每个页面需要引用很多的js和css文件,其中很多都是控件,而且大部分都是一样的,造成很多重复引用. 针对这种情况,参考了mvc的BundleConfig,思路是建立一个公用的用 ...

  8. CAS 4.0 单点登录教程

    CAS 单点登录指导文档 1.概述 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所 ...

  9. 能否使用require('.json')的方式加载大量JSON文件?

    Node.js中推崇非阻塞I/O,但是require一个模块时却是同步调用的,这会带来性能上的开销,但并不是每次require都很耗时,因为在require成功之后会缓存起来,在此加载时直接从缓存读取 ...

  10. iOS 中判断应用程序是否为第一次打开

    第一步:在AppDelegate中当应用启动完成后加入一下代码: - (BOOL)application:(UIApplication *)application didFinishLaunching ...