[英]Caching data in ASP.NET Core app running on Azure without Redis
我想在不依賴 Redis 的情況下緩存一些東西。 我的應用程序是在 Azure 應用服務上運行的 ASP.NET Core API 應用程序。
例如,我創建了一個國家列表
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
我可以將它保存在 Redis 中,但它會花錢,而且這不是一個經常更改的列表,並且是從框架生成的,因此即使我正在運行我的 API 應用程序的多個實例,列表也將是相同的。
如何在沒有 Redis 的情況下將其保存在內存中? 我可以調用一個在我的Startup.cs
中生成這個列表的方法,但我在哪里存儲它以及如何檢索它?
AspNetCore 有一個內置的內存緩存,您可以使用它來存儲請求之間共享的數據片段。
在啟動時注冊緩存...
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
services.AddMvc();
}
public void Configure(IApplicationBuilder app)
{
app.UseMvcWithDefaultRoute();
}
}
你可以像注入...
public class HomeController : Controller
{
private IMemoryCache _cache;
public HomeController(IMemoryCache memoryCache)
{
_cache = memoryCache;
}
public IActionResult Index()
{
string cultures = _cache[CacheKeys.Cultures] as CultureInfo[];
return View();
}
為了使其在應用程序范圍內工作,您可以使用具有強類型成員的外觀服務並結合某種緩存刷新模式:
public CultureInfo[] Cultures { get { return GetCultures(); } }
private CultureInfo[] GetCultures()
{
CultureInfo[] result;
// Look for cache key.
if (!_cache.TryGetValue(CacheKeys.Cultures, out result))
{
// Key not in cache, so get data.
result = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
// Set cache options.
var cacheEntryOptions = new MemoryCacheEntryOptions()
// Keep in cache for this time, reset time if accessed.
.SetSlidingExpiration(TimeSpan.FromMinutes(60));
// Save data in cache.
_cache.Set(CacheKeys.Cultures, result, cacheEntryOptions);
}
return result;
}
當然,您可以通過將其設置為接受緩存作為依賴項的服務來清理它,您可以將其注入到任何需要的地方,但這是一般的想法。
另請注意,如果您想在 Web 服務器之間共享數據,還有一個分布式緩存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.