缓存使用Azure Cache进行REDIS
#云 #redis #azure #caching

在软件开发周期中,我们通常需要专注于改善软件性能。有很多方法可以改善这一点,缓存策略是最好的选择之一。

要了解Redis的Azure Cache是​​什么,请访问Azure Cache for Redis - Overview

什么是缓存模式

这种模式非常简单明了。当我们需要特定数据时,首先,我们尝试从缓存中获取它,如果数据不在缓存中,我们需要从源中获取它,添加到缓存并返回。因此,在下一个查询中,将从缓存中检索数据。

在缓存中添加数据时,我们还需要确定数据应存储多长时间或是否将是永久性。

何时使用此模式

使用此模式时:

  • 当需求无法预测时可以使用此模式,从而可以按需加载数据。

  • 在将经常访问数据并且不会频繁更新的情况下。

缓存无效

缓存无效是从缓存存储中删除数据的过程。仅当数据被更新或从数据库中删除时,才能发生此过程,从而避免了缓存数据的不一致。

Image description

缓存实现

在.NET中实现此模式非常简单明了,为此,我们将使用.NET 6,内存数据库来模拟REDIS资源的真实数据库和Azure Cache的实例。

首先,让我们创建将在数据库中以及缓存中使用的客户实体。

public class Customer
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public string Email { get; set; }
    public string Source { get; set; }
}

下一步是创建内存数据库将使用的上下文。

public class CustomerContext : DbContext
{
    public CustomerContext(DbContextOptions<CustomerContext> options) : base(options)
    { }

    public DbSet<Entity.Customer> Customers { get; set; }
}

现在,让我们在应用程序上配置内存数据库和Azure缓存资源。在 program.cs 上,添加以下代码行。

using Customer.Api.Repository;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<CustomerContext>(opt => opt.UseInMemoryDatabase("CustomerDB"));

builder.Services.AddStackExchangeRedisCache(options => {
    options.Configuration = "your primary or secondary connection string";
});

var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.UseAuthorization();
app.MapControllers();
app.Run();

on builder.services.services.adddbcontext line,我们正在配置内存数据库和 builder.services.addstackexchangerediscache line,我们正在与Azure Cache配置azure Cache for for Azure Cache for使用Azure Portal提供的主要或辅助连接字符串REDIS。

Image description

最后,我们需要实现端点

[HttpGet("{id}")]
public async Task<IActionResult> GetById(int id)
{
        var customerCached = await _cache.GetStringAsync($"customer:{id}");

        if (customerCached is not null)
        {
            var customer = JsonSerializer.Deserialize<Entity.Customer>(customerCached);
            customer.Source = "cache";
            return Ok(customer);
        }

        var customerDb = await _customerContext.Customers.FirstOrDefaultAsync(p => p.Id == id);

        if (customerDb is not null)
        {
            await _cache.SetStringAsync($"customer:{customerDb.Id}", JsonSerializer.Serialize(customerDb), 
                new DistributedCacheEntryOptions
                {
                    AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(30)
                });

            customerDb.Source = "database";
            return Ok(customerDb);
        }

        return Ok("Customer not found");
}

此方法非常简单地理解,我们首先尝试从缓存中获取数据,如果数据不在缓存中,因此我们将从数据库中检索,保存在缓存中并返回用户。

现在,让我们实现缓存无效

[HttpPut("{id}")]
public async Task<IActionResult> Update(int id, Entity.Customer customer)
    {
        var customerDb = await _customerContext.Customers.FirstOrDefaultAsync(p => p.Id == id);
        if (customerDb is not null)
        {
            customerDb.FullName = customer.FullName;
            customerDb.Email = customer.Email;

            _customerContext.Update(customerDb);
            await _customerContext.SaveChangesAsync();

            await _cache.RemoveAsync($"customer:{id}");
            return Ok();
        }

        return Ok("Customer not found");
}

在此流程中,首先,我们从数据库中检索信息以更新信息,并且一旦更新实体,我们将从缓存中删除数据。

这样,我们有一个简单易懂的解决方案,可以提高应用程序的性能并减少数据库操作的开销。

github存储库:abiaoqian

您喜欢这篇文章吗?您想谈谈更多吗?发表评论或通过LinkedIn与您联系。