8 ASP.NET Core
缓存
客户端响应缓存
使用 cache-control 响应报文头, 实现客户端缓存这一请求的结果一段时间, cache-control: max-age=20 表示在浏览器中缓存 20 秒
// 设置缓存 20 秒
[ResponseCache(Duration = 20)]
[HttpGet}
public int GetNum()
{
return 10;
}
服务器端响应缓存
app.UseCors();
// 启用服务器端响应缓存
app.UseResponseCaching();
app.MapControllers();
当使用"禁用缓存"时, 浏览器端请求时带有请求头
cache-control: no-cache, 即使启用了服务器端响应缓存, 服务器也不会从缓存中获取数据
服务器端响应缓存的问题
- 无法解决恶意请求给服务器带来的压力
- 响应状态码为 200 的 GET 或 HEAD 响应才可能被缓存, 报文头中不能含有 Authorization, Set-Cookie 等
内存缓存
// Program.cs
builder.Services.AddMemoryCache();
// 服务类
private readonly IMemoryCache _memoryCache;
public WeatherForecastController(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
public async Task<ActionResult<Book>> GetBook(int id)
{
// 从缓存取数据, 如果没有缓存, 则调用方法, 并返回数据(同时保存到缓存)
var book = await _memoryCache.GetOrCreateAsync("Book_" + id, async entry =>
{
// 没有缓存, 查询数据
Console.WriteLine($"没有缓存, 查询数据");
var bookData = id switch
{
1 => new Book(1, "1"),
2 => new Book(2, "2"),
3 => new Book(3, "3"),
_ => new Book(4, "4")
};
return bookData;
});
if (book == null)
{
return NotFound("查询不到数据");
}
return book;
}