今天来了三位主角,他们分别是大名鼎鼎的 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. 转载 Elasticsearch开发环境搭建(Eclipse\MyEclipse + Maven)

    概要: 1.使用Eclipse搭建Elasticsearch详情参考下面链接 2.Java Elasticsearch 配置 3.ElasticSearch Java Api(一) -添加数据创建索引 ...

  2. 架构之微服务(zookeeper)

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其 ...

  3. THINKPHP 调试------输出sql语句

    echo $model->getLastSql();//$model为实例化的模板类

  4. 智能指针之 shared_ptr

     std::shared_ptr 是通过指针保持对象共享所有权的智能指针.多个 shared_ptr 对象可占有同一对象大概实现了一下,主要实现原理为,共享指针内部持有堆资源 的指针以及引用计数的指针 ...

  5. java读取.properties配置文件的几种方法

    读取.properties配置文件在实际的开发中使用的很多,总结了一下,有以下几种方法(仅仅是我知道的):一.通过jdk提供的java.util.Properties类.此类继承自java.util. ...

  6. Spring加载xml配置文件的方式 ApplicationContext

    大家都知道Java读普通文件是通过Basic I/O 中的InputStream.OutStream.Reader.Writer 等实现的.在spring 框架中,它是怎样识别xml这个配置文件的呢? ...

  7. Mybatis中几个重要类

    http://www.open-open.com/lib/view/open1363572227609.html

  8. 我珍藏的神兵利器 - 效率工具for Win[转]

        工欲善其事必先利其器. 我一直都在不断挑选和优化自己的兵器,以追求着最高效率. 此篇分享下我的私家珍藏的各种神兵利器.如果有朋友能推荐更好的,那就不枉此篇. 分为Windows软件和开发工具两 ...

  9. Eureka源码分析:Eureka不会进行二次Replication的原因

    Eureka不会进行二次同步注册信息 Eureka会将本实例中的注册信息同步到它的peer节点上,这是我们都知道的特性.然而,当peer节点收到同步数据后,并不会将这些信息再同步到它自己的peer节点 ...

  10. Android 百分比布局库(percent-support-lib) 解析与扩展

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46695347: 本文出自:[张鸿洋的博客] 一.概述 周末游戏打得过猛,于是周 ...