簡體   English   中英

在沒有 Redis 的情況下在 Azure 上運行的 ASP.NET Core 應用程序中緩存數據

[英]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();
    }

為了使其在應用程序范圍內工作,您可以使用具有強類型成員的外觀服務並結合某種緩存刷新模式:

  1. 嘗試從緩存中獲取值
  2. 如果嘗試失敗
    • 從數據源中查找數據
    • 重新填充緩存
  3. 返回值

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM