0

我使用 CacheManager ( https://github.com/MichaCo/CacheManager )有这个场景:

  • 1 个控制台应用程序(使用 inproc 缓存句柄 + Redis 缓存句柄作为背板)
  • 1 个 ASP.NET MVC Web 应用程序(使用 inproc 缓存句柄 + Redis 缓存句柄作为背板)

控制台应用程序和 ASP.NET MVC 应用程序的缓存配置是相同的:

var configuration = ConfigurationBuilder.BuildConfiguration(settings =>
        {
            settings                    
                .WithSystemRuntimeCacheHandle("InProc")
                .And
                .WithRedisConfiguration("redis", config =>
                {
                    config.WithAllowAdmin()
                        .WithDatabase(0)
                        .WithEndpoint("localhost", 6379);
                })
                .WithMaxRetries(1000)
                .WithRetryTimeout(100)
                .WithRedisBackplane("redis")
                .WithRedisCacheHandle("redis", true);
        });

        ICacheManager<string> cache = (ICacheManager<string>)CacheFactory.FromConfiguration(typeof(string), configuration);

但是,当我像这样从控制台应用程序执行简单的缓存失效时:

cache.Remove("Key")

它不会从 Web 应用程序的 inproc 缓存句柄中删除。我已经尝试并创建了 2 个具有与上述相同配置的不同控制台应用程序,这就像预期的那样工作(当其中一个控制台应用程序使缓存中的密钥无效时,它也会从另一个控制台应用程序的所有缓存句柄中删除)。

当与 Web 应用程序和控制台应用程序一起使用时,使用 CacheManager 是否有什么特别之处,这意味着缓存同步不起作用?

4

1 回答 1

2

好的,所以在对此进行更多研究后,我意识到控制台应用程序使用 CacheManager 的 1.1.2 版本,而 Web 应用程序使用 1.1.1 版本。升级后,这突然开始工作。

因此,任何其他遇到此问题的人的答案是确保您在访问缓存的所有进程上使用该库的相同版本。但是,除非这是在 1.1.2 中解决的错误,否则我认为即使使用不同的版本也应该可以。毕竟是来自redis背板的pubsub保持同步......

于 2018-09-20T20:26:04.233 回答