官方原生支持的两种ASP.NET Core分布式缓存

概述 

.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.

再来看看数据库,成功生成表和库

官方原生支持的两种ASP.NET Core分布式缓存

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完全一样,这里就不再展示。写入的缓存效果如下

官方原生支持的两种ASP.NET Core分布式缓存

Sql Server分布式缓存的优点是持久化存储方便,微软官方支持兼容好,缺点是关系数据库读取速度没有redis快,但也能满足中小型网站使用。

结语

    本文讲述了asp.net core二种分布式缓存的简单使用,具体大家可以封装成类来使用。希望本文对大家学习和工作有一定参考价值,同时欢迎大家留言讨论,谢谢大家的支持。