.net core 2.0 redis驱动性能比拼

Colin596 等级 694 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
Go-连接Redis-学习go-redis包
Redis介绍 Redis是一个开源的内存数据结构存储,常用作数据库、缓存和消息代理。目前它支持的数据结构有诸如string、hash、list、set、zset、bitmap、hyperloglog、geospatial index和stream。Redis内置了复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Redis Sentinel
微信小程序字符串展示为二维码
微信小程序中要将一个字符串展示为二维码的形式,需要引入该js文件 // Core code comes from https://github.com/davidshimjs/qrcodejsvar QRCode;(function () { / Get the type by string length
gg-editor-core
首发于 ggeditorcore 类似于 g6editor,是 旧版 的核心,现新版 ggeditor 已不再依赖 ggeditorcore,但功能还不完善,有些地方更弱于 ggeditorcore,且。<br /<br /尽管如此,但阿里有些开源产品或者企业产品还是会使用到 ggeditorcore,比如 ,在这些产品的 gi
php操作redis哨兵模式,主从切换后自动获取master
本文将介绍如何使用PHP来连接redis哨兵模式。哨兵模式:大概的原理就是监听redis主库心跳包,如果心跳断开,则枚举一个从库推举成为新的主库,防止redis宕机不能使用。为了增强redis的性能,防止其挂掉,引用redis哨兵监控redis集群是个不错的选择。下面三步简单记录php连接redis哨兵。 第一步、获取哨兵模式连接redis句柄对象/
为什么单线程的Redis能支持高并发?
一、Redis为什么是单线程注意:redis 单线程指的是网络请求模块使用了一个线程,即一个线程处理所有网络请求,其他模块仍用了多个线程。因为CPU不是Redis的瓶颈。Redis的瓶颈最有可能是机器内存或者网络带宽,既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万
Redis集群详解
Redis集群详解Redis有三种集群模式,分别是: 主从模式 Sentinel模式 Cluster模式 三种集群模式各有特点,关于Redis介绍可以参考这里:Redis官网:https://redis.io/ ,最新版本5.0.4 主从模式 主从模式介绍主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(sl
配置AspNet Core发布环境
作者:三十三重天博客:http://www.zhouhuibo.club 添加 Microsoft 存储库密钥和源安装 .NET 之前,需要: 将 Microsoft 包签名密钥添加到受信任密钥列表。 将此存储库添加到包管理器。 安装必需的依赖项。每台计算机只需要执行一次此操作。打开终端并运行以下命令。Bash复制bashsudo rpm Uvh https
.net core Cookie的使用
缘起:  公司领导让我做一个测试的demo,功能大概是这样的:用户通过微信扫一扫登陆网站,如果用户登录过则直接进入主界面,否则就保留在登录界面。实现方法:  首先先把网站地址生成个二维码,在扫描二维码后去获取Cookie如果有值那么就证明登录过直接跳转到主界面,如果Cookie不存在用户通过登录记录的用户信息并保存到Cookie。什么是Cookie:  储存
.net web core 如何编码实现文件上传功能
关于我 前言在进行Web前后端分析开始时,我们经常会碰到文件上传的需求。上传用户头像,上传认证材料、审核材料等,这些都可以归类为文件上传功能。今天主要把自己在开发过程中的心得进行一个整理,供大家学习。 开启静态文件中间件默认情况下,静态文件(如 HTML、CSS、图像和 JavaScript)是 ASP.NET Core 应用直接提供给客户端的资产。开启静态
React.js中JSX的原理与关键实现
在开始开发之前,我们需要创建一个空项目文件夹。安装1. 初始化 npm init y 2.安装webpack相关依赖npm install webpack webpackcli D 3. 安装babelloader相关依赖 npm install babelloader @babel/core @babel/presetenv D 4.
springBoot集成redis
Redis作为一个Java后端面试中的一个常问考点,并且在项目中越来越常用,所以自己动手搭建了一个基于springboot集成redis做为数据缓存的demo(springboot集成mybatis、redis,并具有增删改查询接口)。关注微信公众号【菜鸟阿都】并回复:redis,可获得源码。后面也会继续深入研究redis相关知识,期待与大家一起学习交流。r
给dubbo贡献源码,做梦都在修bug
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。 一在之前的文章《redis在微服务领域的贡献》中,从一次面试经历中了解了redis可以在微服务中玩的这么溜,同时也从源码角度分析了dubbo的redis注册中心。最后得出了dubbo的redis注册中心不能用于生产的结论,其中原因有如下两点: 使用了ke
最新Java大厂高频面试题,看这一篇就够了!
常见resdis面试真题40道(含解析)1. 什么是 Redis?2. Redis 的数据类型?3. 使用 Redis 有哪些好处?4. Redis 相比 Memcached 有哪些优势?5. Memcache 与 Redis 的区别都有哪些?6. Redis 是单进程单线程的?7. 一个字符串类型的值能存储最大容量是多少?8. Redis

热门文章

最新文章