Aspnet Core 在应用程序启动时保留内存缓存数据

Aspnet Core persist In-Memory cache data on application startup

如何在启动和停止 website/debugging 时保留 IMemorycache?。我的印象是 IMemorycache 存储在服务器上并且不会受到网站启动的影响。每次我启动和停止网站时,IMemorycache 条目都被重置为 0 cache.Set("entryA", "data1", cacheEntryOptions); 第一次在配置中调用这一行时,我希望在执行该行代码后缓存中有一个条目。下一次在 5 seconds/minutes 内或到期时间之前,如果我重新启动网站(启动被调用。或停止并开始调试),甚至在代码行被执行之前缓存中应该有一个条目。但这不是它的工作方式。我的理解不正确吗?我需要一种方法来在服务器上保留一个项目至少 20 分钟,而不会在每次调用启动时丢失。

我看到了类似的 post 但不确定标记的答案是如何解决的。在 Program.cs vc 配置中这样做有什么好处。

这是我们的代码

using Microsoft.Extensions.Caching.Memory;
     public Startup(IHostingEnvironment env)
            {
                const string ENV_VARIABLE_SITENAME = "%WEBSITE_SITE_NAME%";
                var siteName = Environment.ExpandEnvironmentVariables(ENV_VARIABLE_SITENAME);
    
                if (string.IsNullOrEmpty(siteName) || siteName == ENV_VARIABLE_SITENAME)
                    siteName = System.Environment.MachineName;
    
                log.Info($"*******Site Name: '{siteName}' ************");
    
                var builder = new ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{siteName}.json", optional: false, reloadOnChange: true)
                    .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                    .AddEnvironmentVariables();
    
                Configuration = builder.Build();
                MyConfiguration = new class.Configuration(Configuration);
            }
    
    
           public void Configure(
                                IApplicationBuilder app,
                                IHostingEnvironment env,
                                ILoggerFactory loggerFactory,
                                IMemoryCache cache
                            )
                    {
                        if (env.IsDevelopment())
                        {
                            app.UseDeveloperExceptionPage();
                            // Use Swagger
                            //app = SwaggerServiceExtensions.UseSwaggerDocumentation(app);
                        }
                        else
                        {
                            //app.UseExceptionHandler("/Error");
                            app.UseHsts();
                        }
            
                        var cacheEntryOptions = new MemoryCacheEntryOptions()
                            .SetSize(1)//Size amount
                            //Priority on removing when reaching size limit (memory pressure)
                            .SetPriority(CacheItemPriority.High)
                            // Keep in cache for this time, reset time if accessed.
                            .SetSlidingExpiration(TimeSpan.FromMinutes(5))
                            // Remove from cache after this time, regardless of sliding expiration
                            .SetAbsoluteExpiration(TimeSpan.FromSeconds(10));
            
                        cache.Set("entryA", "data1", cacheEntryOptions);
                        
                        app.ConfigureExceptionHandler();
            
                        // Use Swagger
                        app = SwaggerServiceExtensions.UseSwaggerDocumentation(app);
            
            
                        }
            
            
            public void ConfigureServices(IServiceCollection services)
                    {
                        // for HttpContext
                        services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            
                        // need MVC
                        services.AddMvc(options =>
                        {
                            options.Filters.Add(new ErrorHandlingFilter());
                        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
            
                        // Memory Cache
                        services.AddMemoryCache();
        }

好吧,那是一个纯内存缓存,它不是独立的实现,它只是 运行 在您的代码中的代码。

而且您似乎对依赖注入的工作原理有一个基本的误解。 Afaik 内存缓存只会在第一次注入时具体化,而不是在调用 'services.AddMemoryCache()' 时。事实上,Cache 已经准备就绪,当它存在时并且 - 通过实现 - 它总是会作为 MemoryCache class 的 100% 新实例出现 - 所以到 Startup() 时里面不可能有所有东西当应用程序(重新)启动时,正在调用并调用启动。您真正要寻找的是持久缓存解决方案,而不是纯粹的内存缓存。

你可以做什么:

  1. 最简单的解决方案:例如,将 IDistributedCache 与 SQL 一起使用。这是一个将 key/value 对存储在数据库中的解决方案,因此是持久的(但也可以在内存中,如果您使用所谓的内存优化 table),我 运行 a 50 gb 大数据库在 SQL 上以这种方式查询结果(通过 REST 开销和一切的互联网)甚至在 1 秒内。

  2. 在它自己的小应用程序上实现 Mem 缓存,添加一个简单的 get/set REST API 来访问它...这样缓存就独立于您的应用程序目前正在开发 - 但是,同样的问题......默认的 IMemoryCache 并不是要持久化的东西,缓存总是必须在应用程序启动后手动更新。

  3. 切换到持久缓存解决方案...例如 REDIS、MemCached 等,但与 NET 提供的简单 DistributedCache on DB 选项相比,这是一项完全不同的任务。