.net core 2.0 redis驱动性能比拼

Colin596 等级 1105 0 0
标签: rediscoreC#

.net core 2.0 redis驱动性能比拼

.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()。

.net core 2.0 redis驱动性能比拼

上面的对比结果不难发现,几个驱动的性能大同小异,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驱动性能比拼 今天来了三位主角,他们分别是大名鼎鼎的 StackExchange.Redis,无敌轻巧的
.NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
.NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐 作者:依乐祝 原本链接:http
.net core Cookie的使用
缘起:  公司领导让我做一个测试的demo,功能大概是这样的:用户通过微信扫一扫登陆网站,如果用户登录过则直接进入主界面,否则就保留在登录界面。实现方法:  首先先把网站地址生成个二维码,在扫描二维码后去获取Cookie如果有值那么就证明登录过直接跳转到主界面,如果Cookie不存在用户通过登录记录的用户信息并保存到Cookie。什么是Cookie:  储存
.NET Core & ConsoleApp & appsettings.json
准备 -- * Visual Studio 2017 * .NET Core 2.1 新建控制台应用(.NET Core) ------------------ ![](https://oscimg.oschina.net/oscnet/74b983141bb944c59b5ed417b5f8dfbb75c.jpg) 默认的 Program.
.NET IDE Rider公布2020.2路线图
跨平台 .NET IDE Rider 近日公布了 2020.2 的路线图,介绍了目前正在开发的一些特性,并表示其中一些可能在接下来的版本中出现。主要包括: * Windows 上的 .NET Core 后端:Rider 2020.1 已在 macOS 和 Linux 上的 .NET Core 上运行 ReSharper 后端。Windows 方面,后端
.net core redis的全套操作
原文: [.net core redis的全套操作](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2Fhailang8%2Fp%2F11391975.html) Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),se
.net core swagger汉化
**基本swagger使用不再详解,具体百度其它帖子** 1.将汉化的swagger js文件复制到项目根目录中 ![](https://oscimg.oschina.net/oscnet/8a46de4361c3973dca1ea77fe1c54ac1084.png) js代码如下 1 'use strict'; 2
.net core 面试题
第1题,什么是ASP net core? 首先ASP net core不是 asp net的升级版本。它遵循了dot net的标准架构, 可以运行于多个操作系统上。它更快,更容易配置,更加模块化,可扩展性更强。 第2题,asp dot core有哪些好的功能? 第一是依赖注入。 第二是日志系统架构。 第三是引入了一个跨平台的网络服务器,kestre
Visual Studio 2017正式版发布全纪录
又是一年发布季,微软借着Visual Studio品牌20周年之际,于美国太平洋时间2017年3月7日9点召开发布会议,宣布正式发布新一代开发利器Visual Studio 2017。同时发布的还有 * .NET Core Tooling 1.0 * .NET Core Microservice instance * Visual Studio
ASP.NET Core 3.0 原生DI拓展实现IocManager
昨天\*\*.NET Core 3.0\*\*正式发布,创建一个项目运行后发现:原来使用的Autofac在ConfigureServices返回IServiceProvider的这种写法已经不再支持。 当然Autofac官方也给出了示例。.NET Core 本身内置DI,我决定不再使用Autofac,就使用原生DI,拓展IServiceCollection
EF core的原生SQL查询以及用EF core进行分页查询遇到的问题
在用.net core进行数据库访问,需要处理一些比较复杂的查询,就不得不用原生的SQL查询了,然而EF Core 和EF6 的原生sql查询存在很大的差异。 在EF6中我们用SqlQuery和ExecuteSqlCommand进行sql语句的执行,而在EF Core中我们则使用FromSql和ExecuteSqlCommand **一.ExecuteS
Exceptionless
<div id="cnblogs\_post\_body" class="blogpost-body cnblogs-markdown"><h1 id="exceptionless---.net-core开源日志框架">Exceptionless - .Net Core开源日志框架</h1> <blockquote> <p>作者:markjiang7m2<b
Linux内核收包过程
net/core/dev.c int __init net_dev_init(void) { queue->backlog.poll = process_backlog; open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL); open_softirq(NET_RX
NET Core的分布式批处理框架
[NET Core的分布式批处理框架](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2Fwww.cnblogs.com%2Fbossma%2Fp%2F10668564.html) ========================================================
Redis启动警告问题的解决
如果启动前不对linux内核做任何更改,那么redis启动会报出警告,共三个:如下图所示  ![](https://oscimg.oschina.net/oscnet/1f4154914df7df862bb8364b8663bb259ce.png) **第一个警告:**The TCP backlog setting of 511 cannot be en

热门文章

最新文章