【问题标题】:Memory cache seems to differ between endpoints in Asp.Net Core Web ApiAsp.Net Core Web Api 中的端点之间的内存缓存似乎不同
【发布时间】: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


【解决方案1】:

问题已解决: 几个小时后,我尝试在启动时创建一个缓存实例并将特定实例注册为单例。有效!但是现在我正在尝试用较小的应用程序重现这个问题并为此创建一个问题:) 下面的代码:

            var memoryCache = new MemoryDistributedCache(
                Options.Create(new MemoryDistributedCacheOptions()));
            services.AddSingleton<IDistributedCache>(memoryCache);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多