zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    2020软件工程作业04
    2020软件工程作业03
    2020软件工程作业02
    2020软件工程作业01
    问题清单
    2020软件工程个人作业06
    2020软件工程作业05
    2020软件工程作业00
    2020软件工程作业04
    2020软件工程作业03
  • 原文地址:https://www.cnblogs.com/hhhnicvscs/p/14547893.html
Copyright © 2011-2022 走看看