.net core 2.0 redis驱动性能比拼
今天来了三位主角,他们分别是大名鼎鼎的 StackExchange.Redis,无敌轻巧的 CSRedis,中通日处理80亿访问的 NewLife.Redis。
作者从2016年学习.netcore以来,接触StackExchange.Redis遇到Timeout,这个问题坑了好多人。有人说2.0重构会解决了这个问题,碰巧本次测试发现2.0版本已经发布,本次测试版本为:2.0.505,期待StackExchange.Redis2.0重构版的测试表现。
CSRedis 已经很出名就不讲了,开源地址:https://github.com/2881099/csredis。
NewLife.Redis 号称日处理80亿访问,代码简洁功能不多,能解决特定的业务场景,看看性能到底有多强劲。
ps: NewLife.Redis 不支持异步方法,所以本次只测试同步方法。
测试代码 |
CSRedis.CSRedisClient csredis = new CSRedis.CSRedisClient("127.0.0.1:6379,password=,defaultDatabase=0,poolsize=100,ssl=false,writeBuffer=20480,prefix=");
StackExchange.Redis.ConnectionMultiplexer seredis = StackExchange.Redis.ConnectionMultiplexer.Connect("127.0.0.1:6379,password=");
StackExchange.Redis.IDatabase seredisDb = seredis.GetDatabase(); var nlredis = Redis.Create("127.0.0.1:6379", 4);
nlredis.Password = "";
var nlredisClient = nlredis.Pool.Get(); Task.Run(() => {
var times = new[] { 1000, 10000, 100000 }; foreach (var time in times) {
var dt_csredis_set = DateTime.Now;
for (var a = 0; a < time; a++) {
csredis.Set($"benchmark_csredis_{a}", Guid.NewGuid().ToString());
}
var ts_csredis_set = DateTime.Now.Subtract(dt_csredis_set); var dt_seredis_set = DateTime.Now;
for (var a = 0; a < time; a++) {
seredisDb.StringSet($"benchmark_seredis_{a}", Guid.NewGuid().ToString());
}
var ts_seredis_set = DateTime.Now.Subtract(dt_seredis_set); var dt_nlredis_set = DateTime.Now;
for (var a = 0; a < time; a++) {
nlredisClient.Set($"benchmark_nlredis_{a}", Guid.NewGuid().ToString());
}
var ts_nlredis_set = DateTime.Now.Subtract(dt_nlredis_set); var dt_csredis_get = DateTime.Now;
for (var a = 0; a < time; a++) {
csredis.Get($"benchmark_csredis_{a}");
}
var ts_csredis_get = DateTime.Now.Subtract(dt_csredis_get); var dt_seredis_get = DateTime.Now;
for (var a = 0; a < time; a++) {
seredisDb.StringGet($"benchmark_seredis_{a}");
}
var ts_seredis_get = DateTime.Now.Subtract(dt_seredis_get); var dt_nlredis_get = DateTime.Now;
for (var a = 0; a < time; a++) {
nlredisClient.Get<string>($"benchmark_nlredis_{a}");
}
var ts_nlredis_get = DateTime.Now.Subtract(dt_nlredis_get); Console.WriteLine($@"
循环次数: {time}
csredis set: {ts_csredis_set.TotalMilliseconds}ms
statckexchange.redis StringSet: {ts_seredis_set.TotalMilliseconds}ms
newlife.redis set: {ts_nlredis_set.TotalMilliseconds}ms csredis get: {ts_csredis_get.TotalMilliseconds}ms
statckexchange.redis StringGet: {ts_seredis_get.TotalMilliseconds}ms
newlife.redis get: {ts_nlredis_get.TotalMilliseconds}ms
");
}
});
测试这段代码,对 csredis 其实不公平的,因为内部使用的连接池有一点消耗,支持单例定义使用,支持并发使用
另外,StackExchange.Redis.IDatabase 事先就初始化了,循环内没有多次 GetDatabase()。
测试结果 |
优化指南 |
上面的对比结果不难发现,几个驱动的性能大同小异,StackExchange.Redis 偏慢一点点。
NewLife.Redis 高性能优化的方向之一PipeLine,redis-server 支持管道模式,即指将一批命令打包,一次提交给 redis-server,减少来往消耗。
NewLife.Redis 通过 rds.AutoPipeLine = 100,设置 rds 集满 100 条命令时 flush 打包提交一次。需要注意这是特定场景优化,比如你的项目访问率低并且用到了缓存,集满 AutoPipeLine 条命令如果需要5秒,及有可能影响缓存更新时间。
CSRedis 也支持 PipeLine 的,代码如下:
var ret1 = RedisHelper.StartPipe().Set("a", "1").Get("a").EndPipe();
var ret2 = RedisHelper.StartPipe(p => p.Set("a", "1").Get("a")); var ret3 = RedisHelper.StartPipe().Get("b").Get("a").Get("a").EndPipe();
//与 RedisHelper.MGet("b", "a", "a") 性能相比,经测试差之毫厘
.net core 2.0 redis驱动性能比拼的更多相关文章
- Net Core 2.0 Redis
Net Core 2.0 Redis配置.封装帮助类RedisHelper及使用实例 https://www.cnblogs.com/oorz/p/9052498.html 本文目录 摘要 Redis ...
- .net core 2.0 Redis的基本使用
存Session 先配置`appsetting.json`文件 "ConnectionStrings": { "Redis": "ip:6379,ab ...
- 译 .NET Core 3.0 发布
原文:<Announcing .NET Core 3.0> 宣布.NET Core 3.0 发布 很高兴宣布.NET Core 3.0的发布.它包括许多改进,包括添加Windows窗体和W ...
- Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例
本文目录 1. 摘要 2. Redis配置 3. RedisHelper 4.使用实例 5. 总结 1. 摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数 ...
- HDD成都站:HMS Core 6.0带来新可能 多元服务驱动产品商业成功
9月10日,由华为开发者联盟主办的HDD(Huawei Developer Day)于成都举行.活动中,华为HMS Core各领域专家重点解读了HMS Core 6.0为开发者带来的多项全新能力,及生 ...
- .net core redis 驱动推荐,为什么不使用 StackExchange.Redis
前言 本人从事 .netcore 转型已两年有余,对 .net core 颇有好感,这一切得益于优秀的语法.框架设计. 2006年开始使用 .net 2.0,从 asp.net 到 winform 到 ...
- .net core redis 驱动推荐,为什么不使用 StackExchange.Redis 转发 https://www.cnblogs.com/kellynic/p/9325816.html
前言 本人从事 .netcore 转型已两年有余,对 .net core 颇有好感,这一切得益于优秀的语法.框架设计. 2006年开始使用 .net 2.0,从 asp.net 到 winform 到 ...
- 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis
安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...
- .net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展
在实际的系统中,可能需要多台机器部署;然而,Signalr的连接信息是跟站点走的,举个例子 推送系统部署了A.B两个服务器,张三访问A服务器,李四访问B服务器,当张三通过A服务器向李四推送的时候,A服 ...
随机推荐
- php判断图片是否存在的几种方法
在我们日常的开发中,经常需要用到判断图片是否存在,存在则显示,不存在则显示默认图片,那么我们用到的判断有哪些呢?今天我们就来看下几个常用的方法: 1.getimagesize()函数 getimage ...
- 字典的.get方法
字典的.get方法表示是dict.get(key,default)用于判断建是否存在,存在返回键对应的值,不存在返回指定的default值 dict = {'a':1,'b':2} dict.get( ...
- facenet 进行人脸识别测试
1.简介:facenet 是基于 TensorFlow 的人脸识别开源库,有兴趣的同学可以扒扒源代码:https://github.com/davidsandberg/facenet 2.安装和配置 ...
- PAT1116: Come on! Let's C
1116. Come on! Let's C (20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue &quo ...
- 网络编程之select
一.select函数简介 select一般用在socket网络编程中,在网络编程的过程中,经常会遇到许多阻塞的函数,网络编程时使用的recv, recvfrom.connect函数都是阻塞的函数,当函 ...
- SSM-Spring-15:Spring中名称自动代理生成器BeanNameAutoProxyCreator
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 名称自动代理生成器:BeanNameAutoProxyCreator 为了更好的测试,我放了俩个接口,俩个实现 ...
- js判断浏览器是否支持flash的方法
传统浏览器可以使用window.ActiveXObject检查浏览器是否启用相关的控件.检查浏览器是否启用flash控件,需要先检查浏览器是否支持ActiveXObject,可以使用typeof检查w ...
- 你不知道的JavaScript--Item4 基本类型和基本包装类型(引用类型)
1.基本类型和引用类型 基本的数据类型有5个:undefined,boolean,number,string,null typeof null; //"object" typeof ...
- python类型转换convert实例分析
在python的开发过程中,难免会遇到类型转换,这里给出常见的类型转换demo: 类型 说明 int(x [,base ]) 将x转换为一个整数 long(x [,base ]) 将x转换为一个长整数 ...
- Java的参数传递是「值传递」还是「引用传递」?
关于Java传参时是引用传递还是值传递,一直是一个讨论比较多的话题. 有人说Java中只有值传递,也有人说值传递和引用传递都是存在的,比较容易让人产生疑问. 关于值传递和引用传递其实需要分情况看待. ...