【问题标题】:is there a Cacheable in C# similar to Java?C#中是否有类似于Java的Cacheable?
【发布时间】:2021-12-28 22:56:01
【问题描述】:

在 Java Spring Boot 中,我可以使用注解 @EnableCaching 轻松启用缓存,并使用 @Cacheable 使方法缓存结果,这样,任何具有完全相同参数的方法的输入都不会调用该方法,但是使用缓存的结果立即返回。

C#中有类似的东西吗?

我过去所做的是我必须实现我自己的缓存类、我自己的数据结构,这很麻烦。我只是想要一个简单的方法让程序缓存结果并在输入参数相同的情况下返回确切的结果。

编辑:我不想使用任何第三方的东西,所以没有 MemCached、没有 Redis、没有 RabbitMQ 等......只是在寻找一个非常简单和优雅的解决方案,比如 Java 的@Cacheable

【问题讨论】:

标签: java c#


【解决方案1】:

缓存

缓存是 Microsoft 提供的最有价值的功能。它是一种相对较小但可以非常快速地访问的内存。它本质上存储可能再次使用的信息。例如,Web 浏览器通常使用缓存来加快网页加载速度,方法是在本地存储网页文件的副本,例如在本地计算机上。

缓存

缓存是将数据存储到缓存中的过程。使用 C# 语言进行缓存非常容易。 System.Runtime.Caching.dll 提供了在 C# 中使用缓存的功能。在这个插图中,我使用了以下类:

对象缓存

内存缓存

CacheItemPolicy

  1. 对象缓存

:CacheItem 类提供缓存条目的逻辑表示,它可以包括使用 RegionName 属性的区域。它存在于 System.Runtime.Caching 中。

  1. 内存缓存

:这个类也属于 System.Runtime.Caching,它表示实现缓存内存的类型。

  1. CacheItemPolicy

:表示特定缓存条目的一组驱逐和到期详细信息。

.NET提供

System.Web.Caching.Cache - ASP.NET 中的默认缓存机制。您可以通过属性Controller.HttpContext.Cache 获取此类的实例,也可以通过单例HttpContext.Current.Cache 获取它。不应显式创建此类,因为在后台它使用另一个内部分配的缓存引擎。要使您的代码正常工作,最简单的方法是执行以下操作:

public class DataController : System.Web.Mvc.Controller{ 
  public System.Web.Mvc.ActionResult Index(){
    List<object> list = new List<Object>();

    HttpContext.Cache["ObjectList"] = list;                 // add
    list = (List<object>)HttpContext.Cache["ObjectList"]; // retrieve
    HttpContext.Cache.Remove("ObjectList");                 // remove
    return new System.Web.Mvc.EmptyResult();
  }
}

System.Runtime.Caching.MemoryCache - 这个类可以在用户代码中构建。它具有不同的界面和更多的功能,如update\remove 回调、区域、监视器等。要使用它,您需要导入库System.Runtime.Caching。它也可以在ASP.net 应用程序中使用,但您必须自己管理它的生命周期。

var cache = new System.Runtime.Caching.MemoryCache("MyTestCache");
cache["ObjectList"] = list;                 // add
list = (List<object>)cache["ObjectList"]; // retrieve
cache.Remove("ObjectList");                 // remove

【讨论】:

    【解决方案2】:

    您可以编写具有获取或创建功能的装饰器。首先,尝试从缓存中获取值,如果不存在,计算并存储到缓存中:

    public static class CacheExtensions
    {
        public static async Task<T> GetOrSetValueAsync<T>(this ICacheClient cache, string key, Func<Task<T>> function)
            where T : class
        {
            // try to get value from cache
            var result = await cache.JsonGet<T>(key);
            if (result != null)
            {
                return result;
            }
            // cache miss, run function and store result in cache
            result = await function();
            await cache.JsonSet(key, result);
            return result;
        }
    }
    

    ICacheClient 是您正在扩展的接口。现在您可以使用:

    await _cacheClient.GetOrSetValueAsync(key, () => Task.FromResult(value));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2011-01-07
      • 2011-08-08
      • 2011-02-27
      相关资源
      最近更新 更多