​本文主要介绍了缓存的概念,以及如何在服务器内存中存储内容。今天的目标是利用IDistributedCache来做一些分布式缓存,这样我们就可以横向扩展我们的web应用程序。

在本教程中,我将使用Redis作为缓存。Redis是一个可靠的快速内存缓存,可以存储多种类型的对象。Redis正在被Twitter, Github, Instagram, Stackoverflow等巨头使用。

你可以在https://github.com/sahan91/DistributedCacheAspNetCoreRedis找到示例代码。

这是我们实现后的一个快照。

  • 用户请求一个User对象。
  • App server检查缓存中是否已经有用户,如果存在则返回对象。
  • App server通过HTTP调用来检索用户列表。
  • Users service将用户列表返回给App server。
  • App server将用户列表发送到分布式(Redis)缓存。
  • App server获得缓存的版本,直到它过期(TTL)。
  • 用户获取缓存的User对象。

我们称其为分布式缓存的主要原因是,它位于应用服务器之外(与传统的内存缓存相反),如果需要的话,我们可以灵活地水平扩展它(在云中操作时)。来看看在企业应用程序中是如何有用的。

IDistributedCache接口为我们提供了一组操作缓存的方法。这里总结了几种不同的方法。

搭建一个示例应用程序

我们将用ASP.NET Core 5创建一个Web MVC应用程序。

dotnet new mvc -n DistributedCachedotnet new slndotnet sln add DistributedCache

让我们继续从NuGet添加Redis客户端包。

dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis --version 5.0.1 

创建一个Redis docker容器

假设已经在你的机器上安装了Docker。这是很方便的,你可以在任何想要开发的时候启动自己的Redis容器。

docker run --name redis-cache -p 5002:6379 -d redis

使用官方的Redis镜像,创建一个名为redis-cache的容器,并将容器的6379端口绑定到主机的5002端口。如果你在本地没有Redis的镜像,它会从DockerHub获取它。接下来让我们验证docker实例是否启动并运行。

docker ps -a

现在我们已经有了Redis容器并运行,接下来配置我们的web应用程序。

应用程序配置

因为我们已经添加了所需的NuGet包,我们只需要在应用的DI容器中注册,并告诉它在哪里可以找到我们的Redis实例。

services.AddStackExchangeRedisCache(options =>{
options.Configuration = Configuration.GetSection("Redis")["ConnectionString"];
});

当我们在服务对象上调用AddStackExchangeRedisCache时,它会在底层通过IDistributedCache接口注册一个RedisCache类的单例。

services.Add(ServiceDescriptor.Singleton<IDistributedCache, RedisCache>()); 

因为我们已经在5002端口上启动并运行了Docker实例,所以我们可以在配置中设置它。

"Redis": {  "ConnectionString": "localhost:5002"}

实现

这个功能很简单,下面是我们要做的:

  • 获取缓存的用户(如果有的话)并显示其电子邮件地址
  • 用于调用HTTP缓存用户列表的按钮
  • 清除缓存的按钮

UI将类似于以下。

让我们看看程序的入口,HomeController类。

public async Task<IActionResult> Index(){
var users = (await _cacheService.GetCachedUser())?.FirstOrDefault();
return View(users);
}

public async Task<IActionResult> CacheUserAsync(){
var users = await _usersService.GetUsersAsync();
var cacheEntry = users.First();
return View(nameof(Index), cacheEntry);
}

public IActionResult CacheRemoveAsync(){
_cacheService.ClearCache();
return RedirectToAction(nameof(Index));
}

这里的代码很容易解释,我们在Index、CacheUserAsync和cacheeremoveasync中实现了之前的3个内容。

跳过所有其他管道代码,并展示我们如何使用Redis缓存获取和设置值。真正神奇的事情发生在ICacheProvider类中。

在GetFromCache方法中,我们使用给定的键(在本例中为_Users)调用GetStringAsync。值得注意的是,在将它返回给调用者之前,我们需要将它反序列化为我们想要的类型。类似地,序列化我们的用户列表,并将它作为字符串保存在Redis缓存中的_Users键下。

public class CacheProvider : ICacheProvider{
private readonly IDistributedCache _cache;

public CacheProvider(IDistributedCache cache)
{
_cache = cache;
} public async Task<T> GetFromCache<T>(string key) where T : class
{
var cachedResponse = await _cache.GetStringAsync(key);
return cachedResponse == null ? null : JsonSerializer.Deserialize<T>(cachedResponse);
}

public async Task SetCache<T>(string key, T value, DistributedCacheEntryOptions options) where T : class
{
var response = JsonSerializer.Serialize(value);
await _cache.SetStringAsync(key, response , options);
}

public async Task ClearCache(string key)
{
await _cache.RemoveAsync(key);
}
}

我们可以连接到容器,打开redis-cli查看里面有什么。

docker exec -it redis-cache redis-cli 

进入后,可以发出hgetall _Users命令来检查缓存中有哪些内容。

结论

在本文中,我们将使用ASP.NET Core提供的IDistributedCache接口,使用Redis作为后台存储。这种方法可以用来利用Azure Redis缓存等云服务,用于响应缓存、会话存储等。

原文链接:https://sahansera.dev/distributed-caching-aspnet-core-redis/

ASP.NET Core与Redis搭建一个简易分布式缓存的更多相关文章

  1. ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存

    前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资 ...

  2. 使用EF Code First搭建一个简易ASP.NET MVC网站,允许数据库迁移

    本篇使用EF Code First搭建一个简易ASP.NET MVC 4网站,并允许数据库迁移. 创建一个ASP.NET MVC 4 网站. 在Models文件夹内创建Person类. public ...

  3. ASP.NET Core 使用 Redis 实现分布式缓存:Docker、IDistributedCache、StackExchangeRedis

    ASP.NET Core 使用 Redis 实现分布式缓存:Docker.IDistributedCache.StackExchangeRedis 前提:一台 Linux 服务器.已安装 Docker ...

  4. asp.net core 使用 Redis 和 Protobuf

    asp.net core 使用 Redis 和 Protobuf 前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介 ...

  5. ASP.NET Core 使用 Redis 客户端

    Mac OS 安装 Redis(用于连 Redis 服务器,方便查看数据):https://redis.io/topics/quickstart wget http://download.redis. ...

  6. Asp.net Core + Log4net + ELK 搭建日志中心

    原文:Asp.net Core + Log4net + ELK 搭建日志中心 Docker中一键安装ELK 对于这种工具类的东西,第一步就直接到docker的hub中查找了,很幸运,不仅有Elasti ...

  7. Angularjs,WebAPI 搭建一个简易权限管理系统

    Angularjs,WebAPI 搭建一个简易权限管理系统 Angularjs名词与概念(一)   1. 目录 前言 Angularjs名词与概念 权限系统原型 权限系统业务 数据库设计和实现 Web ...

  8. 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】

    Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一个控制器 2017-2-2 ...

  9. 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】

    Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...

随机推荐

  1. c# 类(4)

    原文链接:https://csharp.net-tutorials.com/classes/visibility/ 可见性 Visibility 可见性 控制的是 访问权限的问题.最常见的就是priv ...

  2. JAVA中高精度金额计算

    一般java代码中遇到高精度金额计算,日常使用bigDecimal类型. 在使用BigDecimal类来进行计算的时候,主要分为以下步骤: 1.用float或者double变量构建BigDecimal ...

  3. 云原生系列3 pod核心字段

    pod是容器化的基础,好比大楼的地基. Pod跟容器的关系 类比一下: POD: 物理机容器: 物理机上的一个进程: 容器只是Pod的一个普通字段. Pod的作用范围 跟容器的linux namesp ...

  4. Storybook 最新教程

    Storybook 最新教程 Storybook is the most popular UI component development tool for React, Vue, and Angul ...

  5. URL parser All In One

    URL parser All In One const url = new URL(`https://admin:1234567890@cdn.xgqfrms.xyz:8080/logo/icon.p ...

  6. CSS multi colors circle

    CSS multi colors circle <!DOCTYPE html> <html lang="zh-Hans"> <head> < ...

  7. node.js 如何处理一个很大的文件

    node.js 如何处理一个很大的文件 思路 arraybuffer 数据分段 时间分片 多线程 web workers sevice workers node.js 如何处理一个很大的文件 http ...

  8. c++ 使用进程id获取打开的网络端口

    #pragma warning( disable : 4996) #include <winsock2.h> #include <ws2tcpip.h> #include &l ...

  9. linux文件权限的查看和修改(转)

    原文链接:https://www.cnblogs.com/sxdcgaq8080/p/7498906.html 命令: chmod 777 scan_record.js 格式: chmod 权限数字 ...

  10. Centos8.2安装Mongodb4.4.2(社区版)

    1:下载 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-4.4.2.tgz 官网地址: 2:解压 tar -zxv ...