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() 时里面不可能有所有东西当应用程序(重新)启动时,正在调用并调用启动。您真正要寻找的是持久缓存解决方案,而不是纯粹的内存缓存。
你可以做什么:
最简单的解决方案:例如,将 IDistributedCache 与 SQL 一起使用。这是一个将 key/value 对存储在数据库中的解决方案,因此是持久的(但也可以在内存中,如果您使用所谓的内存优化 table),我 运行 a 50 gb 大数据库在 SQL 上以这种方式查询结果(通过 REST 开销和一切的互联网)甚至在 1 秒内。
在它自己的小应用程序上实现 Mem 缓存,添加一个简单的 get/set REST API 来访问它...这样缓存就独立于您的应用程序目前正在开发 - 但是,同样的问题......默认的 IMemoryCache 并不是要持久化的东西,缓存总是必须在应用程序启动后手动更新。
切换到持久缓存解决方案...例如 REDIS、MemCached 等,但与 NET 提供的简单 DistributedCache on DB 选项相比,这是一项完全不同的任务。
如何在启动和停止 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() 时里面不可能有所有东西当应用程序(重新)启动时,正在调用并调用启动。您真正要寻找的是持久缓存解决方案,而不是纯粹的内存缓存。
你可以做什么:
最简单的解决方案:例如,将 IDistributedCache 与 SQL 一起使用。这是一个将 key/value 对存储在数据库中的解决方案,因此是持久的(但也可以在内存中,如果您使用所谓的内存优化 table),我 运行 a 50 gb 大数据库在 SQL 上以这种方式查询结果(通过 REST 开销和一切的互联网)甚至在 1 秒内。
在它自己的小应用程序上实现 Mem 缓存,添加一个简单的 get/set REST API 来访问它...这样缓存就独立于您的应用程序目前正在开发 - 但是,同样的问题......默认的 IMemoryCache 并不是要持久化的东西,缓存总是必须在应用程序启动后手动更新。
切换到持久缓存解决方案...例如 REDIS、MemCached 等,但与 NET 提供的简单 DistributedCache on DB 选项相比,这是一项完全不同的任务。