在软件开发周期中,我们通常需要专注于改善软件性能。有很多方法可以改善这一点,缓存策略是最好的选择之一。
要了解Redis的Azure Cache是什么,请访问Azure Cache for Redis - Overview
什么是缓存模式
这种模式非常简单明了。当我们需要特定数据时,首先,我们尝试从缓存中获取它,如果数据不在缓存中,我们需要从源中获取它,添加到缓存并返回。因此,在下一个查询中,将从缓存中检索数据。
在缓存中添加数据时,我们还需要确定数据应存储多长时间或是否将是永久性。
何时使用此模式
使用此模式时:
-
当需求无法预测时可以使用此模式,从而可以按需加载数据。
-
在将经常访问数据并且不会频繁更新的情况下。
缓存无效
缓存无效是从缓存存储中删除数据的过程。仅当数据被更新或从数据库中删除时,才能发生此过程,从而避免了缓存数据的不一致。
缓存实现
在.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。
最后,我们需要实现端点
[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与您联系。