.NET Core应用中使用分布式缓存及内存缓存
.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中。对于分布式缓存,.NET Core提供了针对Redis和SQL Server的原生支持。除了这个独立的缓存系统之外,ASP.NET Core还借助一个中间件实现了“响应缓存”,它会按照HTTP缓存规范对整个响应实施缓存。ASP.NET Core 支持多种不同的缓存。
常见缓存响应的四种方式
1、内存缓存
顾名思义,缓存在内存中,生命周期默认伴随应用程序
2、响应缓存
响应缓存可减少客户端或代理到 web 服务器发出的请求数。 响应缓存还减少了工作的 web 服务器执行以生成响应。 响应缓存控制标头,指定要如何客户端、 代理和响应缓存中间件。
3、响应缓存中间件
Microsoft.AspNetCore.ResponseCaching 包中的ResponseCaching
4、分布式缓存
比较常用的是基于Redis和数据库的分布式缓存。
在这里我们重点说说内存缓存和分布式缓存。
如果你看到这段文字,说明您正使用RSS阅读或转自《一棵树-博客园》,原文地址:https://www.cnblogs.com/atree/p/netcore-Distributed-Cache.html
将数据缓存在内存中-内存缓存
与针对数据库和远程服务调用这种IO操作来说,应用针对内存的访问性能将提供不止一个数量级的提升,所以将数据直接缓存在应用进程的内容中自然具有最佳的性能优势。与基于内存的缓存相关的应用编程接口定义在NuGet包“Microsoft.Extensions.Caching.Memory”中,具体的缓存实现在一个名为MemoryCache的服务对象中,后者是我们对所有实现了IMemoryCache接口的所有类型以及对应对象的统称。由于是将缓存对象直接置于内存之中,中间并不涉及持久化存储的问题,自然也就无需考虑针对缓存对象的序列化问题,所以这种内存模式支持任意类型的缓存对象。
针对缓存的操作不外乎对缓存数据的存与取,这两个基本的操作都由上面介绍的这个MemoryCache对象来完成。如果我们在一个ASP.NET Core应用对MemoryCache服务在启动时做了注册,我们就可以在任何地方获取该服务对象设置和获取缓存数据,所以针对缓存的编程是非常简单的。不想看这些,直接看案例。
static void Main (string[] args)
{
MemoryCache memoryCache = new MemoryCache(new MemoryCacheOptions());
memoryCache.Set("name", "tom");
var value = memoryCache.Get("name");
Console.WriteLine(value); Console.ReadKey();
}
设置过期时间:
static void Main (string[] args)
{
MemoryCache memoryCache = new MemoryCache (new MemoryCacheOptions ());
memoryCache.Set ("name", "jack", new MemoryCacheEntryOptions () {
AbsoluteExpiration = DateTimeOffset.Now.AddSeconds () //设置为5秒后过期
});
while (true) {
System.Threading.Thread.Sleep ();
string value;
if (!memoryCache.TryGetValue ("name", out value)) {
value = "已过期";
}
Console.WriteLine (value);
}
}
基于内存的缓存具有最高的性能,但是由于它实际上是将缓存数据存在承载ASP.NET Core应用的Web服务上,对于部署在集群式服务器中的应用会出现缓存数据不一致的情况。对于这种部署场景,我们需要将数据缓存在某一个独立的存储中心,以便让所有的Web服务器共享同一份缓存数据,我们将这种缓存形式称为“分布式缓存”。ASP.NET Core为分布式缓存提供了两种原生的存储形式,一种是基于NoSQL的Redis数据库,另一种则是微软自家关系型数据库SQL Server。
基于Redis的分布式缓存
Redis数目前较为流行NoSQL数据库,很多的编程平台都将它作为分布式缓存的首选,接下来我们来演示如何在一个ASP.NET Core应用中如何采用基于Redis的分布式缓存。考虑到一些人可能还没有体验过Redis,所以我们先来简单介绍一下如何安装Redis。Redis最简单的安装方式就是采用Chocolatey(https://chocolatey.org/) 命令行,后者是Windows平台下一款优秀的软件包管理工具(类似于NPM)。
采用PowerShell (要求版本在V3以上)命令行
iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex
或者普通CMD.exe命令行:
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
来安装Chocolatey。在确保Chocolatey 被本地正常安装情况下,我们可以执行执行如下的命令安装或者升级64位的Redis。
C:\>choco install redis-64
C:\>choco upgrade redis-64
Redis服务器的启动也很简单,我们只需要以命令行的形式执行redis-server命令即可。如果在执行该命名之后看到如下图所示的输出,则表示本地的Redis服务器被正常启动,输出的结果会指定服务器采用的网络监听端口。为了方便管理,可以下载安装:客户端工具:RedisDesktopManager。
针对Redis的分布式缓存实现在NuGet包“Microsoft.Extensions.Caching.Redis”之中,所以我们需要确保该NuGet包被正常安装。不论采用Redis、SQL Server还是其他的分布式存储方式,针对分布式缓存的操作都实现在DistributedCache这个服务对象向,该服务对应的接口为IDistributedCache。
IDistributedCache接口包含同步和异步方法。 接口允许在分布式缓存实现中添加、检索和删除项。 IDistributedCache接口包含以下方法:
Get、 GetAsync
采用字符串键并以byte[]形式检索缓存项(如果在缓存中找到)。
Set、SetAsync
使用字符串键向缓存添加项byte[]形式)。
Refresh、RefreshAsync
根据键刷新缓存中的项,并重置其可调过期超时值(如果有)。
Remove、RemoveAsync
根据键删除缓存项。
在项目启动Setup.cs中注册:Redis服务
public void ConfigureServices (IServiceCollection services)
{
//将Redis分布式缓存服务添加到服务中
services.AddDistributedRedisCache (options => {
//用于连接Redis的配置 Configuration.GetConnectionString("RedisConnectionString")读取配置信息的串
options.Configuration = "localhost"; // Configuration.GetConnectionString("RedisConnectionString");
//Redis实例名RedisDistributedCache
options.InstanceName = "RedisDistributedCache";
});
services.AddMvc ();
}
实例对象,构造注入
private DistributedCache _Cache; /// <summary>
/// 构造注入
/// </summary>
/// <param name="Cache"></param>
public ValuesController (IDistributedCache Cache) {
_Cache = new DistributedCache (Cache);
}
调用DistributedCache 类中的方法
[HttpGet ("{id}")]
public string Get (int id) {
//添加
bool booladd = _Cache.Add ("id", "sssss");
//验证
bool boolExists = _Cache.Exists ("id");
//获取
object obj = _Cache.Get ("id");
//删除
bool boolRemove = _Cache.Remove ("id");
//修改
bool boolModify = _Cache.Modify ("id", "ssssssss"); return obj.ToString ();
}
基于SQL Server的分布式缓存
除了使用Redis这种主流的NoSQL数据库来支持分布式缓存,微软在设计分布式缓存时也没有忘记自家的关系型数据库采用SQL Server。针对SQL Server的分布式缓存实现在“Microsoft.Extensions.Caching.SqlServer”这个NuGet包中,我们先得确保该NuGet包被正常装到演示的应用中。
所谓的针对SQL Server的分布式缓存,实际上就是将标识缓存数据的字节数组存放在SQL Server数据库中某个具有固定结构的数据表中,因为我们得先来创建这么一个缓存表,该表可以借助一个名为sql-cache 的工具来创建。在执行sql-cache 工具创建缓存表之前,我们需要在project.json文件中按照如下的形式为这个工具添加相应的NuGet包“Microsoft.Extensions.Caching.SqlConfig.Tools”。
在 SqlServer 数据库引擎中创建一个数据库,命名为:TestDb,打开项目根目录,执行创建缓存数据表的操作,执行命令后如果输出信息:Table and index were created successfully. 表示缓存表创建成功.
dotnet sql-cache create "Server=.\SQLEXPRESS;User=sa;Password=123456;Database=TestDb" dbo AspNetCoreCache
在 Startup.cs 中注册分布式缓存
public void ConfigureServices (IServiceCollection services) {
services.AddDistributedSqlServerCache (options => {
options.SystemClock = new BLL.LocalSystemClock ();
options.ConnectionString = this.Configuration["ConnectionString"];
options.SchemaName = "dbo";
options.TableName = "AspNetCoreCache";
options.DefaultSlidingExpiration = TimeSpan.FromMinutes ();
options.ExpiredItemsDeletionInterval = TimeSpan.FromMinutes ();
});
...
}
在控制器中使用分布式缓存
[Route ("api/Home")]
[ApiController]
public class HomeController : Controller {
private IDistributedCache cache;
public HomeController (IDistributedCache cache) {
this.cache = cache;
} [HttpGet ("Index")]
public async Task<ActionResult<string>> SetTime () {
var CurrentTime = DateTime.Now.ToString ();
await this.cache.SetStringAsync ("CurrentTime", CurrentTime);
return CurrentTime;
} [HttpGet ("GetTime")]
public async Task<ActionResult<string>> GetTime () {
var CurrentTime = await this.cache.GetStringAsync ("CurrentTime");
return CurrentTime;
}
}
就这样,用起来挺方便的。
.NET Core应用中使用分布式缓存及内存缓存的更多相关文章
- 【安卓中的缓存策略系列】安卓缓存之内存缓存LruCache
缓存策略在移动端设备上是非常重要的,尤其是在图片加载这个场景下,因为图片相对而言比较大会花费用户较多的流量,因此可用缓存方式来解决,即当程序第一次从网络上获取图片的时候,就将其缓存到存储设备上,这样在 ...
- 【转】图片缓存之内存缓存技术LruCache、软引用 比较
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- 图片_ _图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- 图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常, 这个问题曾经让我觉得很烦恼,后来终于得到了解决, 那么现在就让我和大家一起分享一下吧. 这篇博文要讲的图片缓存机制,我接触到的有两 ...
- Android 图片三级缓存之内存缓存(告别软引用(SoftRefrerence)和弱引用(WeakReference))
因为之前项目同事使用了图片三级缓存,今天整理项目的时候发现同事还是使用了软引用(SoftRefrerence)和弱引用(WeakReference),来管理在内存中的缓存.看到这个我就感觉不对了.脑海 ...
- 转 图片缓存之内存缓存技术LruCache,软引用
每当碰到一些大图片的时候,我们如果不对图片进行处理就会报OOM异常,这个问题曾经让我觉得很烦恼,后来终于得到了解决,那么现在就让我和大家一起分享一下吧.这篇博文要讲的图片缓存机制,我接触到的有两钟,一 ...
- ASP.NET Core中的缓存[1]:如何在一个ASP.NET Core应用中使用缓存
.NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓存,.NET Core提供了针对 ...
- NET Core应用中使用缓存
NET Core应用中使用缓存 .NET Core针对缓存提供了很好的支持 ,我们不仅可以选择将数据缓存在应用进程自身的内存中,还可以采用分布式的形式将缓存数据存储在一个“中心数据库”中.对于分布式缓 ...
- ASP.NET Core 6框架揭秘实例演示[16]:内存缓存与分布式缓存的使用
.NET提供了两个独立的缓存框架,一个是针对本地内存的缓存,另一个是针对分布式存储的缓存.前者可以在不经过序列化的情况下直接将对象存储在应用程序进程的内存中,后者则需要将对象序列化成字节数组并存储到一 ...
随机推荐
- JVM的监控工具之jstat
参考博客:https://www.cnblogs.com/lxcmyf/p/9878293.html jstat(JVMStatisticsMonitoringTool)是用于监视虚拟机各种运行状态信 ...
- 【Python】运算符
python是强类型语言,某些场合下需要进行类型转换.关系运算符的结果是true或false.这里介绍一下基本的运算符,和几个使用实例,了解并掌握python中range()函数和math类库的引入和 ...
- SAP MM模块相关透明表收集
物料表 MCHA 批次表(批次.评估类型 工厂物料) MARA 查看物料数据(发票名称.创建时间.人员) MARC 物料数据查询(利润中心.状态.在途) MAKT 查看物料描述 MKPF 物料抬头 M ...
- jQuery 杂项方法大全
下表列出了所有jQuery 杂项方法: 方法 描述 data() 将数据附加到选定元素或从中获取数据 get() 获取选择器匹配的DOM元素 index() 从匹配的元素中搜索给定的元素 $.noCo ...
- Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)
Java基础之 集合体系结构详细笔记(Collection.List.ArrayList.LinkedList.Vector) 集合是JavaSE的重要组成部分,其与数据结构的知识密切相联,集合体系就 ...
- Android 自定义水平进度条的圆角进度
有时项目中需要实现水平圆角进度,如下两种,其实很简单 下面开始看代码,先从主界面布局开始看起: <?xml version="1.0" encoding=" ...
- 一条SELECT查询语句在数据库里执行时都经历了什么
每天都在跟 mysql 打交道,你知道执行一条简单的 select 语句,都经历了哪些过程吗? 首先,mysql 主要是由 server 层和存储层两部分构成的.server 层主要包括连接器.查询缓 ...
- 以太网PHY寄存器分析【转】
转自:https://blog.csdn.net/Firefly_cjd/article/details/79825869 以太网PHY寄存器分析 1 1.以太网PHY标准寄存器分析 2 ...
- python 模块、包
#-----模块.包----- 模块: 一个.py 文件就称之为模块模块好处:1.提高代码可读性 2.编写代码不需要从零开始 python 模块: 1.python标准库 2.第三方模块 3.应用程序 ...
- 初始v4l2(六)-------根据虚拟驱动vivi的使用彻底分析摄像头驱动
前面的几篇文章已经分析了v4l2的框架,对框架的分析是比较粗浅的,能基本清楚函数之间的调用过程.但是很多内容并没有分析,比如说里面有很多ioctl,并没有分析哪些ioctl是必须的,也没有分析如何从应 ...