本文主要介绍了缓存的概念,以及如何在服务器内存中存储内容。今天的目标是利用IDistributedCache来作一些分布式缓存,这样咱们就能够横向扩展咱们的web应用程序。git
在本教程中,我将使用Redis做为缓存。Redis是一个可靠的快速内存缓存,能够存储多种类型的对象。Redis正在被Twitter, Github, Instagram, Stackoverflow等巨头使用。github
你能够在https://github.com/sahan91/DistributedCacheAspNetCoreRedis找到示例代码。web
这是咱们实现后的一个快照。redis
咱们称其为分布式缓存的主要缘由是,它位于应用服务器以外(与传统的内存缓存相反),若是须要的话,咱们能够灵活地水平扩展它(在云中操做时)。来看看在企业应用程序中是如何有用的。docker
IDistributedCache接口为咱们提供了一组操做缓存的方法。这里总结了几种不一样的方法。缓存
搭建一个示例应用程序服务器
咱们将用ASP.NET Core 5建立一个Web MVC应用程序。mvc
dotnet new mvc -n DistributedCachedotnet new slndotnet sln add DistributedCache
让咱们继续从NuGet添加Redis客户端包。async
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"}
实现
这个功能很简单,下面是咱们要作的:
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/