概述
.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.StackExchangeRedis2、在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.SqlServer2、建库和生成表
新建一个名叫“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二种分布式缓存的简单使用,具体大家可以封装成类来使用。希望本文对大家学习和工作有一定参考价值,同时欢迎大家留言讨论,谢谢大家的支持。