ASP.NET Core与Redis搭建一个简易分布式缓存
本文主要介绍了缓存的概念,以及如何在服务器内存中存储内容。今天的目标是利用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搭建一个简易分布式缓存的更多相关文章
- ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存
前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介绍下怎么样在 asp.net core 中使用 Redis 进行资 ...
- 使用EF Code First搭建一个简易ASP.NET MVC网站,允许数据库迁移
本篇使用EF Code First搭建一个简易ASP.NET MVC 4网站,并允许数据库迁移. 创建一个ASP.NET MVC 4 网站. 在Models文件夹内创建Person类. public ...
- ASP.NET Core 使用 Redis 实现分布式缓存:Docker、IDistributedCache、StackExchangeRedis
ASP.NET Core 使用 Redis 实现分布式缓存:Docker.IDistributedCache.StackExchangeRedis 前提:一台 Linux 服务器.已安装 Docker ...
- asp.net core 使用 Redis 和 Protobuf
asp.net core 使用 Redis 和 Protobuf 前言 上篇博文介绍了怎么样在 asp.net core 中使用中间件,以及如何自定义中间件.项目中刚好也用到了Redis,所以本篇就介 ...
- ASP.NET Core 使用 Redis 客户端
Mac OS 安装 Redis(用于连 Redis 服务器,方便查看数据):https://redis.io/topics/quickstart wget http://download.redis. ...
- Asp.net Core + Log4net + ELK 搭建日志中心
原文:Asp.net Core + Log4net + ELK 搭建日志中心 Docker中一键安装ELK 对于这种工具类的东西,第一步就直接到docker的hub中查找了,很幸运,不仅有Elasti ...
- Angularjs,WebAPI 搭建一个简易权限管理系统
Angularjs,WebAPI 搭建一个简易权限管理系统 Angularjs名词与概念(一) 1. 目录 前言 Angularjs名词与概念 权限系统原型 权限系统业务 数据库设计和实现 Web ...
- 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 ...
- 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. ...
随机推荐
- Linux 驱动框架---设备文件devfs
设备文件系统 Linux引入了虚拟文件系统,从而使设备的访问可以像访问普通文件系统一样.因此在内核中描述打开文件的数据inode中的rdev成员用来记录设备文件对应到的设备号.设备文件也由一个对应的f ...
- 最新 Steam 免费游戏
最新 Steam 免费游戏 免费 免费游戏 免费开玩 免费游戏玩的游戏是有内购的. 免费开玩游戏开玩是一部分免费,玩到某个地方要购买才能继续玩. 免费就是永久免费并且无内购. refs https:/ ...
- 币圈沸腾!SPC空投上线!不要错过!
币圈最近处于沸腾的时刻,NGK侧链代币SPC已上线钱包,3.0公链NGK生态之SPC空投又来了,NGK的上一个项目BGV投资收益率最高破一千七百倍,NGK官方此次以算力持有者为中心,将发起第二轮福利- ...
- 【HTB系列】靶机Access的渗透测试详解
出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) Hack The Box是一个CTF挑战靶机平台,在线渗透测试平台.它能帮助你提升渗透测 ...
- linux下安装mysql8.0.x步骤
1.下载mysql mysql官网:https://dev.mysql.com/downloads/mysql/ 将下载的mysql上传打linux 2.解压并重命名 [root@rsyncClien ...
- 鸿蒙的js开发部模式16:鸿蒙布局Grid网格布局的应用一
鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口]目录:1.Grid简介2.使用Grid布局实现的效果3.grid-row-gap和grid-colunm-gap属性4.< ...
- VMware vSphere 虚拟化平台的安装及使用
首先解释一下这些名词, vSphere是什么? vSphere 是VMware公司发布的一整套产品包,是VMware公司推出的一套服务器虚拟化解决方案,包含VMware ESXi hypervisor ...
- pwn篇:攻防世界进阶welpwn,LibcSearcher使用
攻防世界welpwn (搬运一篇自己在CSDN写的帖子) 链接:https://blog.csdn.net/weixin_44644249/article/details/113781356 这题主要 ...
- SpringBoot(一):使用IDEA快速搭建一个SpringBoot项目(详细)
环境: JDK1.8 Maven:3.5.4 1.打开IDEA,右上角选择File→New→Project 选择Spring Initializr(使用IDEA自带的插件创建需要电脑联网) 2.点 ...
- Newbe.Claptrap 框架入门,第二步 —— 创建项目
接上一篇 Newbe.Claptrap 框架入门,第一步 -- 开发环境准备 ,我们继续了解如何创建一个 Newbe.Claptrap 项目. Newbe.Claptrap 是一个用于轻松应对并发问题 ...