📜  c# .net 核心内存缓存 - C# (1)

📅  最后修改于: 2023-12-03 14:39:42.205000             🧑  作者: Mango

C# .NET 核心内存缓存

在 .NET Core 中,内存缓存是一种能够存储键/值对的轻量级缓存实现。它可用于在内部应用程序中缓存结果。这可以减少计算工作的重复,并提高应用程序的性能。在本文中,我们将探讨如何使用 C# .NET 核心内存缓存。

使用内存缓存

要使用内存缓存,首先需要在项目中添加 Microsoft.Extensions.Caching.Memory NuGet 包。这个包包含了 IMemoryCache 接口,该接口定义了内存缓存的功能。在代码中,你可以使用这个接口创建内存缓存。

在使用内存缓存时,通常是在初始化应用程序时创建内存缓存,例如在 ConfigureServices 方法中的代码中:

public void ConfigureServices(IServiceCollection services)
{
  services.AddMemoryCache();
  // Other services ...
}

通过这个代码,我们可以将内存缓存服务添加到应用程序的服务集合中。

要使用内存缓存进行缓存操作,你需要先通过依赖注入获得缓存实例:

public class HomeController : Controller
{
  private readonly IMemoryCache _cache;

  public HomeController(IMemoryCache memoryCache)
  {
    _cache = memoryCache;
  }

  // ...
}

在使用 _cache 实例进行缓存操作时,你需要指定一个唯一的键与值进行关联。我们可以使用任何类型作为键值对。例如,要将一个字符串与一个整数值进行关联,可以将以下代码添加到控制器中的 Index 方法中:

public IActionResult Index()
{
  int value;

  // Check if value is in cache
  if (_cache.TryGetValue("CachedValue", out value))
  {
    // Use the cached value
    ViewBag.CachedValue = value;
  }
  else
  {
    // Calculate the value
    value = CalculateValue();

    // Store the value in cache
    _cache.Set("CachedValue", value, TimeSpan.FromMinutes(1));

    ViewBag.CachedValue = value;
  }

  return View();
}

private int CalculateValue()
{
  // ... Some time-consuming calculation
}

在上述代码中,我们在缓存中检查一个名为 "CachedValue" 的值是否存在,如果存在,则使用该值;否则,我们就调用自己的 CalculateValue 函数来计算一个新值,并将其存储在缓存中。我们使用 TimeSpan.FromMinutes(1) 指定了缓存时间。这意味着该值在 1 分钟后过期。

缓存选项

除了上面提到的时间间隔之外,还有其他选项可用于配置内存缓存。例如,我们还可以用以下代码指定滑动过期或绝对过期时间:

_cache.Set("ValueWithSlidingExpiration", value, new MemoryCacheEntryOptions
{
  SlidingExpiration = TimeSpan.FromSeconds(30)
});

_cache.Set("ValueWithAbsoluteExpiration", value, new MemoryCacheEntryOptions
{
  AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10)
});

在上述代码中,我们创建了两个不同的缓存项,一个使用滑动过期时间,一个使用绝对过期时间。SlidingExpiration 属性表示项将在最后一次访问后的指定时间间隔内过期,而不管创建时间。AbsoluteExpirationRelativeToNow 属性表示缓存项在创建后的指定时间后过期。如果两个属性同时设置,则按最短时间算。

此外,还可以使用 MemoryCacheEntryOptions 类的其他属性,例如 PrioritySize,对缓存进行更细粒度的控制。

缓存回收

当应用程序中的内存已满时,缓存对象可能会被回收,此时缓存项会过期。要处理这种情况,可以通过 RegisteredForDispose 方法注册一个回收处理程序,该处理程序将在对象被释放时执行。例如:

var cacheEntryOptions = new MemoryCacheEntryOptions()
  .SetPriority(CacheItemPriority.NeverRemove)
  .RegisterPostEvictionCallback((key, value, reason, state) =>
  {
    Console.WriteLine($"Evicted: {key} because {reason}");
  });
_cache.Set("ValueWithCallback", value, cacheEntryOptions);

在上述代码中,我们注册了一个回收处理程序,当缓存对象被释放时,该处理程序将输出一条日志信息。

结论

使用内存缓存是一种提高 .NET Core 应用程序性能的简单方法。本文介绍了内存缓存的基本概念,以及如何使用它们来缓存计算结果和其他数据。希望你已经了解了内存缓存的基本概念和用法,并可以在自己的应用程序中使用它来提高性能和响应时间。