【发布时间】:2020-08-26 08:20:02
【问题描述】:
我在使用内存缓存时遇到了问题(分别尝试了IMemoryCache 和IDistributedCache 与AddMemoryCache() 和AddDistributedMemoryCache)。似乎我的asp.net core 2.2 web api的端点之间没有共享缓存,但它是为1个端点的请求共享的。缓存被注入到单例服务的构造函数中。
这是我关心的问题:
1)请求到达端点A,它调用API,将响应存储到缓存并返回。
2) 下一个请求转到端点 A 并且... 成功获得缓存响应 - 好的。
3) 但是当调用一个端点 B 时,我无法获得缓存响应(使用相同的键)并且缓存似乎是空的
编辑:检查后我发现我确实为我的 API 的不同端点获得了另一个 MemoryCache 实例。
EDIT2:代码示例 迪:
services.AddDistributedMemoryCache();
services.AddSingleton<ICacheStore, CacheStore>();
services.AddScoped<CosmosDbUserRepository>();
services.AddScoped<IUserRepository>(sp =>
{
var realRepository = sp.GetRequiredService<CosmosDbUserRepository>();
var cache = sp.GetRequiredService<ICacheStore>();
return new CachedUserRepository(realRepository, cache);
});
缓存存储:
internal class CacheStore : ICacheStore
{
private static readonly JsonSerializer Serializer = new JsonSerializer();
private readonly IDistributedCache _cache;
public CacheStore(IDistributedCache cache)
{
_cache = cache ?? throw new ArgumentNullException(nameof(cache));
}
}
示例端点:
[HttpGet]
[ProducesResponseType(typeof(UserDetails), (int)HttpStatusCode.OK)]
public async Task<IActionResult> GetUserDetails(
[FromServices] QueryMediator mediator)
{
return Ok(
await mediator.HandleQuery<GetUserDetailsQuery, UserDetails>(null));
}
[HttpPatch("username")]
[ProducesResponseType((int)HttpStatusCode.NoContent)]
public async Task<IActionResult> ChangeUsername(
[FromBody] ChangeUsernameCommand command,
[FromServices] CommandMediator mediator)
{
await mediator.HandleCommand(command);
return NoContent();
}
【问题讨论】:
-
您需要提供有关实施的更多细节。乍一看,您似乎期望 A 和 B 上的内存缓存是相同的,即使它们是完全分开的。 A 不能访问 B 的内存缓存,反之亦然。因此,您需要在两者之间共享数据存储(可能是键/值对)。 Redis 可能是一个很好的解决方案 - 与许多其他解决方案一样 - 取决于要求/需要/可用资源等。
-
您好!感谢您的回复。我知道使用 Redis 或 sql server 的可能性,但我认为内存缓存是为一项服务共享的(称为 A 和 B 的端点来自一个 api,甚至是一个控制器)。在这一点上,我将不得不重新实现缓存机制,目前我不想在 Redis 上花钱。谢谢!
-
这听起来很奇怪。使用
AddMemoryCache()在 DI 容器上注册一个单例内存缓存,因此无论在哪个端点,请求之间的缓存都应该相同。向我们展示其中一个端点的控制器代码,我们或许可以提供帮助。 -
嗨!感谢您的回复。我也认为这很奇怪,不应该以这种方式工作。我已经放了代码示例以进行澄清。
标签: c# .net asp.net-core