【问题标题】:How to use IMemoryCache in a application with multiple instances如何在具有多个实例的应用程序中使用 IMemoryCache
【发布时间】:2020-05-06 16:24:16
【问题描述】:

我在由云代工厂托管的 ASP.Net 核心 Web 应用程序中使用 IMemoryCache。

应用程序有 3 个实例。

一切正常,但是当我想删除缓存时,它仅在一个实例上从逻辑上删除缓存,而其他两个实例仍然具有旧的(缓存的)值。

我的代码如下:

Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
       // other code...
       services.AddMemoryCache();
       // other code...
    }

ExampleController.cs

    private IMemoryCache cache;

    public ExampleController(IMemoryCache cache)
    {
        this.cache = cache;
    }

    private void ClearCacheByKey(string key)
    {
        this.cache.Remove(key);
    }

如何处理缓存和应用程序的多个实例的问题?

【问题讨论】:

  • @CodeCaster 我的应用程序没有数据库
  • 那么您错过了该链接的重点。内存缓存不能扩展到多台服务器。你需要一个分布式缓存。 一个这样的解决方案使用 SQL Server,但您也可以使用 Redis,例如。

标签: c# asp.net-core caching cloud-foundry


【解决方案1】:

内存缓存使用应用程序的内存来缓存内容。 因此,您拥有三个内存缓存实例,每个应用程序实例上都有一个。它们中的每一个都是独立于其他的。如果您写入其中一个,它不会写入其他实例,同样适用于删除。

话虽如此,我认为如果您使用集中式缓存机制会更好。这样您的应用程序的所有实例都会调用同一个缓存实例。

或者,但是我不建议这样做,您可以创建一个端点来清除缓存,当您在一台机器上使缓存失效时需要调用它,以使其在所有其他机器上失效应用程序的实例。

【讨论】:

  • 如果你还想使用 IMemoryCache。您可以拥有一个应用程序来执行此操作,而所有其他应用程序都使用它来从缓存中获取/删除数据。
  • 旁注:如果您的应用程序在 Cloud Foundry 上运行,当您发送请求时,它们将在您的所有应用程序实例中循环。对于像清除内存缓存这样的情况,您需要确保向每个应用程序实例发出请求,您可以使用X-CF-APP-INSTANCE 标头强制向特定实例发出请求,请参阅docs.cloudfoundry.org/concepts/…。希望有帮助!
猜你喜欢
  • 1970-01-01
  • 2021-08-08
  • 2018-09-09
  • 2019-05-20
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多