.NET 7中使用Redis

作者:微信公众号:【架构师老卢】
3-17 15:13
27

概述:本文将深入探讨分布式缓存技术以及如何在 .NET 应用程序中使用它。Redis如果你不熟悉内存缓存领域,请查看本文了解基础知识。NET 7 和内存缓存使用 IMemoryCache 增强 API 性能这篇文章还将容纳我们将要开始的例子。都准备好了吗?太棒了,让我们直接跳进去吧!在这里获取源代码。理解RedisRedis是一种内存中数据结构存储,可用作数据库、缓存和消息代理。这是万事通!以其高性能(因为它在内存中运行)而闻名,还具有以下功能:Redis交易复制故障恢复消息数据过期时间与我们上一篇文章中讨论的传统内存缓存相比,它是分布式系统的绝佳选择,因为它以最高的性能将对象集中存储在内存中。它还

本文将深入探讨分布式缓存技术以及如何在 .NET 应用程序中使用它。Redis

如果你不熟悉内存缓存领域,请查看本文了解基础知识。

NET 7 和内存缓存

使用 IMemoryCache 增强 API 性能

这篇文章还将容纳我们将要开始的例子。

都准备好了吗?太棒了,让我们直接跳进去吧!

在这里获取源代码。

理解Redis

Redis是一种内存中数据结构存储,可用作数据库、缓存和消息代理。这是万事通!

以其高性能(因为它在内存中运行)而闻名,还具有以下功能:Redis

  • 交易
  • 复制
  • 故障恢复
  • 消息
  • 数据过期时间

与我们上一篇文章中讨论的传统内存缓存相比,它是分布式系统的绝佳选择,因为它以最高的性能将对象集中存储在内存中。它还为系统提供容错和复制功能,使其成为分布式系统的弹性替代方案。Redis

启动实例Redis

为了获得最大的方便,我雇用来启动本地服务器实例。这是我使用的命令:DockerRedis

docker container run -d -p 6379:6379 --name redis redis

连接正在运行的 Docker 容器Redis

为了与服务器交互,RedisInsight派上用场。Redis

配置

下一步是安装必要的 NuGet 包。若要将所需的包安装到项目中,请右键单击解决方案,然后选择**“管理解决方案的 NuGet 包”,**现在在搜索框中搜索名为 和 的两个包,然后一次安装一个包。或者,可以在 NuGet 包管理器命令提示符处键入下面显示的命令:Microsoft.Extensions.Caching.StackExchangeRedisStackExchange.redis

PM> Install-Package Microsoft.Extensions.Caching.StackExchangeRedis  
PM> Install-Package StackExchange.Redis

在类中调用此方法时,需要提供配置(类似于连接字符串)和实例名称Program

builder.Services.AddStackExchangeRedisCache(options =>  
{  
    options.InstanceName = "My Redis Instance";  
    options.Configuration = "localhost:6379";  
});  
  
builder.Services.AddHttpClient();

在 中创建密钥名称时,实例名称将发挥作用。Redis

使用实现解决方案Redis

根据我们之前的示例,我们将使用公共 RestCountry API 来检索有关世界国家/地区的数据。

该类表示要保存的数据,其实现方式如下:Country

public class Country  
{  
    public string Name { get; set; }  
    public string Capital { get; set; }  
    public string Region { get; set; }  
    public string Demonym { get; set; }  
}

定义类后,我们将创建 .接下来,我们将实现该操作,该操作可由路径上的 HTTP GET 方法访问。CountryCountriesControllerGetCountriesapi/countries

[Route("api/[controller]")]
public class CountriesController : ControllerBase
{
    private readonly IDistributedCache _distributedCache;
    private readonly IHttpClientFactory _httpClientFactory;
    private const string CountriesKey = "Countries";
    private const string RestCountriesUrl = "https://restcountries.eu/rest/v2/all";

    public CountriesController(IDistributedCache distributedCache, IHttpClientFactory httpClientFactory)
    {
        _distributedCache = distributedCache;
        _httpClientFactory = httpClientFactory;
    }

    [HttpGet]
    public async Task<IActionResult> GetCountries()
    {
        var countriesObject = await _distributedCache.GetStringAsync(CountriesKey);
        
        if (!string.IsNullOrWhiteSpace(countriesObject))
        {
            return Ok(countriesObject);
        }

        var httpClient = _httpClientFactory.CreateClient();
        var response = await httpClient.GetAsync(RestCountriesUrl);

        var responseData = await response.Content.ReadAsStringAsync();

        var countries = JsonConvert.DeserializeObject<List<Country>>(responseData);

        var memoryCacheEntryOptions = new DistributedCacheEntryOptions
        {
            AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(3600),
            SlidingExpiration = TimeSpan.FromSeconds(1200)
        };

        await _distributedCache.SetStringAsync(CountriesKey, responseData, memoryCacheEntryOptions);

        return Ok(countries);
    }
}

在此示例中,流程如下:

  1. 使用常量中指定的键从中提取数据。RedisCountriesKey
  2. 如果它不是空或 null,则返回缓存数据的 OK。这是最快的路径。
  3. 如果没有,请使用 .HttpClientHttpClientFactory
  4. 拨打 .RestCountriesUrl
  5. 以字符串形式获取返回值,并将其反序列化为 .Country
  6. 实例化缓存设置,定义绝对过期时间(1 小时或 3600 秒)和每次访问时重置的相对时间(20 分钟或 1200 分钟)。Redis
  7. 将返回的 API 对象保存在缓存中。Redis
  8. 返回 OK 并显示列表。

该类处理配置,接口执行操作。DistributedCacheEntryOptionsIDistributedCache

你有它!您的密钥是在 API 调用之后创建的,其中包含插入时定义的 和 密钥的串联。RedisInstanceName

使用的利弊Redis

每枚硬币都有两面,也不例外。所以,系好安全带,让我们踏上兜风之旅,探索风景秀丽的风景和崎岖不平的地形!RedisRedis

优点

超快的冈萨雷斯

Redis活在内存中,我们都知道,与蜗牛节奏的磁盘存储相比,内存就像超级英雄 Flash。这允许以曲速获取和存储数据。Redis

数据类型 Dynamo

与您的花园品种数据库不同,它拥有强大的数据类型库。列表、集合、排序集合、哈希,应有尽有!所以,无论你是组织聚餐还是策划统治世界,你都能满足你的需求!RedisRedis

保质期不仅适用于牛奶

使用 ,您可以设置任何数据的生存时间。因此,与冰箱里那碗剩下的意大利面不同,您的数据会知道什么时候该优雅地离开。Redis

群集和复制

Redis允许数据分片和主从复制,使其成为数据库世界的蝙蝠侠和罗宾 - 在对抗数据丢失和确保高可用性方面无与伦比的团队。

缺点

健忘的弗雷德

由于主要依赖于内存;如果停电或系统崩溃,可能会丢失最近的数据,就像你的朋友弗雷德一样,他永远不记得他把钥匙放在哪里。RedisRedis

不喜欢复杂的查询

Redis一切都与速度有关,而复杂的查询就像赛道上的减速带。虽然它支持基本操作,但不要指望它像关系数据库那样执行复杂的联接或子查询。Redis

尺寸很重要

使用 ,您的数据必须适合内存,因此,如果您的数据多于内存,则会出现问题。这就像试图把河马挤进迷你库珀——必须付出一些东西!Redis

一切都是为了钱,亲爱的!

是的,内存很快。但它也比磁盘空间更昂贵。如果你的预算看起来更像是学生的午餐钱,而不是CEO的奖金,那么成本可能是一个重大障碍。

所以,伙计们,你有它!高点和低点,是的和不是。请记住,与任何技术一样,它不是灵丹妙药。这一切都是为了找到适合这项工作的工具。因此,权衡这些利弊,并明智地做出选择。RedisRedis

最后的思考

好吧,伙计们,我们今天已经踏上了一段相当长的旅程,不是吗?从令人眼花缭乱的内存数据结构到Docker的实用性,我们已经遍历了动态环境和应用程序。我们不要忘记通过HTTP走廊的高速追逐。RedisASP.NET CoreHttpClient

像任何难忘的冒险一样,我们也有过惊险和寒意。我们发现它既可能是速度恶魔,也可能是健忘的朋友。但是,嘿,没有人是完美的,对吧?就像你最喜欢的超级英雄一样,也有它的优点和缺点。RedisRedis

只要记住这一点:在它最亮的地方使用,但不要忘记它的局限性。有时,最快的汽车并不是风景优美的驾驶的最佳选择。有时,这辆车正是您赢得比赛所需要的。

相关留言评论
昵称:
邮箱:
阅读排行