今天来了三位主角,他们分别是大名鼎鼎的 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驱动性能比拼的更多相关文章

  1. Net Core 2.0 Redis

    Net Core 2.0 Redis配置.封装帮助类RedisHelper及使用实例 https://www.cnblogs.com/oorz/p/9052498.html 本文目录 摘要 Redis ...

  2. .net core 2.0 Redis的基本使用

    存Session 先配置`appsetting.json`文件 "ConnectionStrings": { "Redis": "ip:6379,ab ...

  3. 译 .NET Core 3.0 发布

    原文:<Announcing .NET Core 3.0> 宣布.NET Core 3.0 发布 很高兴宣布.NET Core 3.0的发布.它包括许多改进,包括添加Windows窗体和W ...

  4. Asp.Net Core 2.0 项目实战(6)Redis配置、封装帮助类RedisHelper及使用实例

    本文目录 1. 摘要 2. Redis配置 3. RedisHelper 4.使用实例 5. 总结 1.  摘要 由于內存存取速度远高于磁盘读取的特性,为了程序效率提高性能,通常会把常用的不常变动的数 ...

  5. HDD成都站:HMS Core 6.0带来新可能 多元服务驱动产品商业成功

    9月10日,由华为开发者联盟主办的HDD(Huawei Developer Day)于成都举行.活动中,华为HMS Core各领域专家重点解读了HMS Core 6.0为开发者带来的多项全新能力,及生 ...

  6. .net core redis 驱动推荐,为什么不使用 StackExchange.Redis

    前言 本人从事 .netcore 转型已两年有余,对 .net core 颇有好感,这一切得益于优秀的语法.框架设计. 2006年开始使用 .net 2.0,从 asp.net 到 winform 到 ...

  7. .net core redis 驱动推荐,为什么不使用 StackExchange.Redis 转发 https://www.cnblogs.com/kellynic/p/9325816.html

    前言 本人从事 .netcore 转型已两年有余,对 .net core 颇有好感,这一切得益于优秀的语法.框架设计. 2006年开始使用 .net 2.0,从 asp.net 到 winform 到 ...

  8. 把旧系统迁移到.Net Core 2.0 日记 (15) --Session 改用Redis

    安装Microsoft.Extensions.Caching.Redis.Core NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装,此NuGet包 ...

  9. .net core 3.0 Signalr - 04 使用Redis做底板来支持横向扩展

    在实际的系统中,可能需要多台机器部署;然而,Signalr的连接信息是跟站点走的,举个例子 推送系统部署了A.B两个服务器,张三访问A服务器,李四访问B服务器,当张三通过A服务器向李四推送的时候,A服 ...

随机推荐

  1. php中的抽象方法和抽象类,简单明了,一点通

    1.什么是抽象方法?    我们在类里面定义的没有方法提的方法就是抽象方法.所谓的没有方法体指的是,在声明的时候没有大括号以及其中的内容,而是直接在声明时在方法名后加上分号结束,另外在声明抽象方法时方 ...

  2. PHP采用Cookie实现 购物车

    先来看一下逻辑分析图:

  3. SpringCloud实战-Eureka

    熟悉微服务架构或Dubbo框架的都知道,微服务中最核心.最基础的组件就是注册中心了.下面利用Spring Cloud Eureka实现服务注册中心.并注册一个简单的服务提供者. 首先先创建一个spir ...

  4. 详解CSS选择器、优先级与匹配原理【转】

    作为一个Web开发者,掌握必要的前台技术也是很重要的,特别是在遇到一些实际问题的时候.这里给大家列举一个例子: 给一个p标签增加一个类(class),可是执行后该class中的有些属性并没有起作用.通 ...

  5. scrapy安装过程问题解决、新建项目、调试断点

    一.安装问题 1. 下载速度太慢 使用国外源,下载速度很慢,可以考虑使用豆瓣的镜像下载 pip install -i https://pypi.douban.com/simple/ scrapy 2. ...

  6. Python学习 Part3:数据结构

    Python学习 Part3:数据结构 1. 深入列表: 所有的列表对象方法 list.append(x): 在列表的末尾添加一个元素 list.extend(L): 在列表的末尾添加一个指定列表的所 ...

  7. css基础--深入理解opacity和rgba的区别

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 首先这两个都与透明度有关,那么他们之间有什么具体的区别呢?在实际工作中我们需要注意什么呢?请您接着往下看 语法 1. rg ...

  8. 【转】JavaScript 错误处理与调试——“错误处理”的注意要点

    try-catch语句 该语句最适合处理那些我们无法控制的错误,在明明白白地知道自己的代码会发生错误时,再使用该语句就不太合适了. ECMA-262第3版引入了try-catch语句,基本的语法如下所 ...

  9. Linux时间子系统之(三):用户空间接口函数

    专题文档汇总目录 Notes:用户空间时间相关接口函数: 类型 API 精度 说明 时间 time stime time_t 精度为秒级 逐渐要被淘汰.需要定义__ARCH_WANT_SYS_TIME ...

  10. Day1 《机器学习》第一章学习笔记

    <机器学习>这本书算是很好的一本了解机器学习知识的一本入门书籍吧,是南京大学周志华老师所著的鸿篇大作,很早就听闻周老师大名了,算是国内机器学习领域少数的大牛了吧,刚好研究生做这个方向相关的 ...