用分布式缓存提升ASP.NET Core性能

得益于纯净、轻量化并且跨平台支持的特性,ASP.NET Core作为热门Web应用开发框架,其高性能传输和负载均衡的支持已广受青睐。实际上,10-20台Web服务器还是轻松驾驭的。有了多服务器负载的支持,使得Web应用层在业务增长时随时采用水平扩展,ASP.NET Core也能够没有什么负担地处理长事务。然而造成性能瓶颈的地方仍然不可忽视,具体来说首当其冲就是数据存储,无法随着应用层的性能提升而提高大规模数据处理能力,这是因为数据层是没有办法简单通过增加服务器得到改善的。

ASP.NET Core应用有两类数据在数据存储成为瓶颈时突显出来:

  1. 数据库

  2. Session会话

解决方案: 分布式缓存


解决这个性能瓶颈,不妨试试NCache,它是一个开源的支持.NET的分布式缓存,它的优势在于完全基于内存,所以你可以在业务增长时组建内存服务器的集群来实现线性扩展,相比于数据库能节省近八成的成本,并且在读写应用数据上得到更快的体验。NCache很适合存储session会话,在多Web服务器负载时也解决了会话保持的需求。

下图是NCache这类常见的分布式缓存的部署架构。

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

ASP.NET Core应用数据缓存IDistributedCache


在ASP.NET Core之前,旧的ASP.NET程序的缓存对象是独立进程的,也没有多服务器支持的需要。现今ASP.NET Core推出了IDistributedCache统一接口,定义了分布式缓存的基本接口,类似于日志、注入容器的接口一样,可以无缝提供第三方扩展。

IDistributedCache接口使用示例:

IDistributedCache _cache;

...

private byte[] LoadCustomer(string custId) {

    string key = "Customers:CustomerID:" + custId;

    // is the customer in the cache?

    byte[] customer = _cache.Get(key);

 

    if(customer == null) {

       // the cache doesn't have it. so load from DB

       customer = LoadFromDB(key);

       // And, cache it for next time

       _cache.Set(key, customer);

    }

 

    return customer;

}

NCache是IDistributedCache的一种实现,所以在ASP.NET Cor应用中使用NCache不需要特殊的配置。

以下是IDistributedCache接口的定义(注意每个方法都有对应的Async版本的重载)。

namespace Microsoft.Extensions.Caching.Distributed

{

    public interface IDistributedCache

    {

        // Each of these methods also has an “Async” overload

        byte[] Get(string key);

        void Refresh(string key);

        void Remove(string key);

 

        // Specify absolute & sliding expiration thru options

        void Set(string key, byte[] value, DistributedCacheEntryOptions options);

    }

}

接下来在ASP.NET Core的Startup类中配置NCacheIDistributedCache

public class Startup

{

    ...

    public void ConfigureServices(IServiceCollection services)

    {

        ...

        services.AddNCacheDistributedCache();

        ...

    }

    ...

}

如果对缓存需求不高, 使用IDistributedCache保留了更改分布式缓存灵活性。但是要权衡这种放弃高级缓存特性的成本。为什么不考虑一下NCache?NCache API在ASP.NET Core应用内可以直接使用,和旧的ASP.NET Cache API非常相似,它包含了大量零成本新特性,可以获得企业级的分布式缓存收益。记住一点,看在性能提升和扩展能力的份上,早用早享受。没有这些高级特性,那只能可怜地缓存一些简单数据。这份NCache caching features了解更多差别。

ASP.NET Core会话存储到分布式缓存


旧的ASP.NET的会话状态由框架提供,允许第三方组件以插件形式接入。在ASP.NET Core中的会话也是相似的,采用链式插件调用,有两种方式使用NCache作为ASP.NET Core的会话存储:

1.NCache作为ASP.NET Core的IDistributedCache Provider存储配置

如果把NCache作为ASP.NET Core的IDistributedCache provider进行配置,NCache能自动的成为会话的默认存储方式,不用再有多余的操作。但是相比于旧的ASP.NET会话状态,这种方式能使用到的特性有限。

以下是ASP.NET Core默认会话缺失的地方:

  1. ASP.NET Core无会话锁提供。

  2. 自定义对象的byte数组支持:  ASP.NET Core强制你在把自定义对象存储到会话前先转换成byte数组。

2. NCache作为ASP.NET Core的Sessions Provider配置

比起前一个方式,NCache已经实现了ASP.NET Core的Sessions Provider。这种方式拥有更多的特性可以利用。

以下是在Startup类进行配置的示例。

public class Startup

{

    ...

    public void Configure(IApplicationBuilder app,  IHostingEnvironment env)

    {

        ...

        app.UseNCacheSession();

        ...

    } 

    ...

}

你可以在appsettings.json文件中做如下ASP.NET Core会话配置。

{

    ...

    "NCacheSessions": {

        ...

        "CacheName": "demoCache",

        "EnableLogs": "True",

        "RequestTimeout": "90",

        "EnableDetailLogs": "False",

        "ExceptionsEnabled": "True",

        "WriteExceptionsToEventLog": "False"

    }

    ...

}


在Configure NCache IDistributedCache Provider了解更多会话存储配置信息。

NCache是比Redis成为ASP.NET Core更好选择的原因


微软提供了IDistributedCache Providers两种可选方案。一个是SQL Server另一个是Redis。NCache比这两种方案更胜一筹表面上看是因为执行更快,更易扩展,当然还有以下原因:

  1. 原生.NET:  NCache是100%原生.NET,更易融入.NET应用技术栈。反观来自Linux背景的Redis和原生.NET毕竟有兼容潜在问题。

  2. 比Redis更快:  NCache确实比Redis要快。NCache客户端缓存的执行能力表现不俗。

  3. 更多特性:  NCache提供了Redis所没有的分布式缓存特性。参见这里:Redis vs NCache。 

NCache更多详情:Nache Details  Edition Comparison  Download 

(原文:How to Optimize ASP.NET Core Performance with Distributed Cache?)

相关文章:

  • 理解并从头搭建redis集群

  • .net core 使用Redis的发布订阅

  • ABP从入门到精通(3):aspnet-zero-core 使用Redis缓存

  • Redis集群~StackExchange.Redis(10月6号版1.1.608.0)连接Twemproxy支持Auth指令了

原文地址 http://www.cnblogs.com/BeanHsiang/p/8733100.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3、oracle数据库的语法基础

ORACLE语法基础 ORACLE的语法基础主要包括数据类型和SQL语法。 1.数据类型 1.1字符型 用于存储文本的数据类型 CHAR(固定长度字符串1-2000个字节) VARCHAR2(可变长度字符串,字符串1-4000个字节) LONG(更…

123记住密码设置

1、打开123所在安装目录 2、进入config目录 3、找到.ovpn文件 4、找到auth-user-pass,没有的话在最后填写即可 在.ovpn同级目录下创建一个.txt文件,然后在这里设置一下 例如:auth-user-pass pass.txt 5、创建.txt文件,填写用户名…

Visual Studio 2017 15.7预览版发布

Visual Studio 2017已经发布一年多了,微软一直持续定期推出更新。第7个预览版也已发布,这一版本继续带来大量的改进。首先是增加了对TypeScript 2.8的支持。TypeScript 2.8带来了条件类型、JSX Pragma和映射类型标识符的可控性。VS2017的其他改进还包括在…

P3377-[模板]左偏树(可并堆)

正题 题目链接:https://www.luogu.com.cn/problem/P3377 题目大意 开始时nnn个只有一个数的集合&#xff0c;要求支持 合并两个集合查询一个集合中的最小值并删除 解题思路 左偏树就是维护一个满足以下性质的树 对于valxval_xvalx​有valx<vallsxval_x<val_{ls_x}va…

4、oracle数据库的查询基础

ORACLE查询基础 介绍oracle下数据的查询时用到的一些运算符、关键字和函数。 1.运算符 在进行数据查询时&#xff0c;有的时候不只是查询字段值&#xff0c;还需要做一些数据处理的操作&#xff0c;这时候就用到了运算符 -- 算术运算符 - * / -- 连接运算符 || -- 比较运算…

2018年4月更新70多个公司dnc招聘职位

2018年4月更新70多个公司dnc招聘职位请在本页回复&#xff0c;补充dnc招聘信息、公司案例dnc简介dnc .NET Core、dotnet Core简写dnc是微软新一代主力编程平台&#xff0c;开源、免费、跨平台、轻量级、高性能&#xff0c;可部署到Linux、Docker、k8s等环境&#xff0c;适合开…

P1552-[APIO2012]派遣【左偏树】

正题 题目链接:https://www.luogu.com.cn/problem/P1552 题目大意 一个nnn个点森林&#xff0c;每个点有价值和代价&#xff0c;选择一个点并在这个点的子树中选择一些点使得。 选择的点数∗该点的价值选择的点数*该点的价值选择的点数∗该点的价值最大且选择的点的代价之和不…

5、oracle下数据完整性约束

ORACLE下数据完整性约束 为了保证数据的完整性和结构的正确性&#xff0c;oracle也有很多约束条件。 1.数据完整性 为了保证数据的完整性&#xff0c;一般对数据列&#xff08;字段&#xff09;进行如下约束&#xff0c;主键约束&#xff08;PRIMARY KEY&#xff09;、唯一键…

把旧系统迁移到.Net Core 2.0 日记(1) - Startup.cs 解析

因为自己到开发电脑转到Mac Air&#xff0c;之前的Webform/MVC应用在Mac 跑不起来&#xff0c;而且.Net Core 2.0 已经比较稳定了。1. 为什么会有跨平台的.Net Core 近年来&#xff0c;我们已经进入云计算时代&#xff0c;在云平台的PaSS和SaSS上也是发生了大幅度的进化&#x…

P3261-[JLOI2015]城池攻占【左偏树】

正题 题目链接:https://www.luogu.com.cn/problem/P3261 题目大意 nnn个点的树&#xff0c;每个节点有一个防御值和一个攻击后的影响(让你的伤害加上一个数或者乘上一个数) 然后mmm个骑士&#xff0c;给定初始攻击点和初始伤害&#xff0c;不停往上走&#xff0c;遇到防御小于…

6、oracle数据库下查询操作

ORACLE下查询操作 针对数据库操作最多的就是数据查询&#xff0c;这里分享一个我常用的方法&#xff0c;看到需求后&#xff0c;先确定查询范围&#xff0c;就是需要查询哪些表&#xff1b;之后确定查询条件&#xff1b;最后写出查询的字段。 ORACLE中之前说过有两个伪列ROWI…

ASP.NET Core 2.0 : 图说管道,唐僧扫塔的故事

本文通过一张GIF动图来继续聊一下ASP.NET Core的请求处理管道&#xff0c;从管道的配置、构建以及请求处理流程等方面做一下详细的研究。&#xff08;ASP.NET Core系列目录&#xff09;一、概述上文说到&#xff0c;请求是经过 Server监听>处理成httpContext>Application…

P3521-[POI2011]ROT-Tree【线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/P3521 题目大意 一棵二叉树&#xff0c;叶子节点有权值&#xff0c;对于每个非叶子节点可以选择交换左右节点&#xff0c;求最后遍历出来的叶子节点权值逆序对最少。 解题思路 十分显然一个节点是否交换是不影响该节点子树之…

7、oracle下的序列

ORACLE下的序列 序列是一种数据库对象&#xff0c;用于生成一系列的整数&#xff0c;可以用来唯一的标记一条记录&#xff0c;在mysql种有字段自增的概念&#xff0c;但是oracle种是没有字段自增的&#xff0c;所以可以使用序列来作为主键的自动生成方式。 1.序列的使用 序列…

ASP.NET MVC应用迁移到ASP.NET Core及其异同简介

ASP.NET Core是微软新推出支持跨平台、高性能、开源的开发框架&#xff0c;相比起原有的ASP.NET来说&#xff0c;ASP.NET Core更适合开发现代应用程序&#xff0c;如跨平台、Dorker的支持、集成现代前端开发框架(如npm、bower、gulp等等)。另外相比ASP.NET它的性能更好&#xf…

Div1 小A抓小B tarjan双连通分量缩点+dfs

题目描述 小A和小B在一个无向图G上进行一个游戏。图G是连通的&#xff0c;有n个点&#xff0c;n条边&#xff0c;无重边&#xff0c;无自环&#xff0c;结点编号为1~n。游戏开始前小A在结点x&#xff0c;小B在结点y&#xff08;x≠y&#xff09;。游戏开始后&#xff0c;小A和小…

P3809-[模板]后缀排序(SA)

正题 题目链接:https://www.luogu.com.cn/problem/P3809 题目大意 长度为nnn的字符串&#xff0c;求它的字符数组(后缀排序后排名为iii的在哪个位置)。 解题思路 大概思路就是倍增排序&#xff0c;先排每个后缀的第一个字符&#xff0c;然后是两个&#xff0c;然后是四个&am…

8、oracle数据库下的索引

ORACLE下的索引 索引是oracle下的一类对象&#xff0c;主要用于提高查询的效率。 1.操作索引 1.1 创建、修改索引 -- 添加一般索引 create index i_test_tname on test(tname); -- 添加唯一索引&#xff0c;不能包含相同的值 create unique index i_test_tname on test(tnam…

使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

本文的概念内容来自深入浅出设计模式一书.项目需求有一家咖啡店, 供应咖啡和茶, 它们的工序如下:咖啡:茶:可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, 另外两步虽然具体内容不一样, 但是都做做的同一类工作.现在问题也有了, 当前的设计两个…

P2396-yyylovesMathsVII【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P2396 题目大意 nnn个数字&#xff0c;依次选择若干个数字使得没有任何一个前缀和等于厄运数字&#xff0c;厄运数字有mmm个。 解题思路 先预处理出disidis_idisi​表示集合iii的数字和。 然后对于disidis_idisi​不等于厄运…