概述
.NET的内存缓存比较适合部署到单机,那么涉及到规模比较中大型网站,由于单机内存等环境的限制,已经不适合使用内存缓存了,另外如果内存缓存分布式部署可能会造成数据不同步、不能数据持久化、使用不方便等问题。这就需要使用分布式缓存了。分布式缓存由一个服务端实现管理和控制,有多个客户端节点存储数据,作为应用的外部共享服务缓存,根据一致性哈希算法等确定数据的存储和读取节点。分布式缓存有跨多个服务器请求、应用服务器宕机和重启后仍然有效、数据可以读写分离、高性能、高可用等优点。这篇文章介绍ASP.NET CORE 基于Redis和Sql Server分布式缓存。.
一、使用概述
Redis和sql server分布式缓存的使用方法基本相同,来自于IDistributedCache接口和DistributedCacheExtensions扩展类。可以通过DistributedCacheEntryOptions类配置过期时间等。
1、读使用Get、GetString及其对应的异步方法。根据key键获取对应的值
2、写可以使用Set、SetString及其对应的异步方法
3、移除可以使用Remove及其对应的异步方法
下面分别举例说明redis和sql server分布式缓存的使用。
二、Redis分布式缓存
我们这里新建一个ASP.NET Core 6.0 web API网站来演示使用,可以分为三步使用
1、安装redis依赖包
使用Redis分布式缓存需要安装Redis的支持包,可以通过nuget命令安装,如下
install-package Microsoft.Extensions.Caching.StackExchangeRedis
2、在Program.cs文件中注册
注册需要配置链接地址和名称,如下:
builder.Services.AddStackExchangeRedisCache(option =>
{
option.Configuration = "10.10.10.110:6379";//链接地址
option.InstanceName = "myredis";//名字
});
3、在项目API控制中使用
首先服务注入,如下:
public IDistributedCache _cache;
public CacheController(IDistributedCache cache) {
_cache=cache;
}
我们用三个接口方法来演示增加、获取、移除缓存,可以在增加的缓存使用配置设置过期时间,如下:
[HttpPost]
public async Task<IActionResult> Post()
{
DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();
//相对过期时间 请求10分钟内有再次请求会再延长十分钟,否则失效
//options.SlidingExpiration = TimeSpan.FromSeconds(10);
//2. 绝对过期时间(两种形式) 绝对是请求5秒过期无论使用与否都失效
options.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(80);
//options.AbsoluteExpiration= new DateTimeOffset(DateTime.Parse("2022-08-27 16:33:10"));
await _cache.SetStringAsync("KeyName", "Cache");
return Ok();
}
[HttpGet]
public async Task<IActionResult> rGet()
{
await _cache.GetStringAsync("KeyName");
return Ok();
}
[HttpDelete]
public async Task<IActionResult> Delete()
{
await _cache.RemoveAsync("KeyName");
return Ok();
}
这样可以运行程序试试,看能否正常运行。我们正常的情况下可以把这个封装成个类来使用更方便。
Redis分布式缓存优点是基于内存访问速度快,使用方便不用建表等。
三、Sql Server分布式缓存
Sql Server分布式缓存使用方法跟Redis分布式缓存大同小异,最大的不同是Sql Server分布式缓存需要建表,另外配置略有不同。同样我们使用上面的API来使用使用Sql Server分布式缓存,步骤如下:
1、安装Sql Server分布式缓存依赖包
install-package Microsoft.Extensions.Caching.SqlServer
2、建库和生成表
新建一个名叫“CacheDB”表,并执行如下命令自动生成表。
dotnet sql-cache create "Server=localhost;User=sa;Password=123456;Database=CacheDB" dbo AspNetCoreCache
这里有个坑,安装报错,错误提示如下:
找不到 "dotnet sql-cache" 命令,请运行以下命令进行安装
dotnet tool install --global dotnet-sql-cache
用提示命令安装继续报错,笔者通过查看nuget官网说明,需要带上指定版本号才能执行成功,如下:
dotnet tool install --global dotnet-sql-cache --version 6.0.0
这时候再执行dotnet sql-cache create后成功建表,并返回如下提示
Table and index were created successfully.
再来看看数据库,成功生成表和库
3、在Program.cs文件中注册
注册方式略有不同,如下:
builder.Services.AddDistributedSqlServerCache(option =>
{
//option.SystemClock = new LocalSystemClock();//这里为啥这样写,因为时区问题
option.ConnectionString = "Server=localhost;User=sas;Password=654321;Database=CacheDB";
option.SchemaName = "dbo";//指定类型
option.TableName = "AspNetCoreCache";//表名,默认,也可以在这指定
option.DefaultSlidingExpiration = TimeSpan.FromMinutes(3);//设置默认过期时间
});
//设置本地时区
public class LocalSystemClock : ISystemClock
{
public DateTimeOffset UtcNow => DateTime.Now;
}
这样就完成了配置。API接口跟redis完全一样,这里就不再展示。写入的缓存效果如下
Sql Server分布式缓存的优点是持久化存储方便,微软官方支持兼容好,缺点是关系数据库读取速度没有redis快,但也能满足中小型网站使用。
结语
本文讲述了asp.net core二种分布式缓存的简单使用,具体大家可以封装成类来使用。希望本文对大家学习和工作有一定参考价值,同时欢迎大家留言讨论,谢谢大家的支持。