【问题标题】:Contentful .NET caching内容丰富的 .NET 缓存
【发布时间】:2026-02-06 11:05:02
【问题描述】:

有谁知道是否有现有的方法可以通过 .NET Contentful SDK 使用缓存,例如您可以使用 the PHP one 做什么?或者是滚动您自己的缓存机制的唯一选择?

【问题讨论】:

    标签: .net contentful


    【解决方案1】:

    这种类型的缓存目前在 .NET SDK 中不可用。

    用你自己的实现来扩展IContentfulClient接口是相当容易的,比如CachingContentfulClient,它只会在会话或应用程序存储中按id存储每个条目,并且只获取缓存中不存在的条目.

    类似:

    public class CachingContentfulClient {
        private IContentfulClient _inner;
        public CachingContentfulClient(IContentfulClient inner) {
            _inner = inner;
        }
    
       public async Task<ContentfulCollection<T>> GetEntries<T>(string queryString = null, CancellationToken cancellationToken = default)
            {
         //if cache contains stuff, return stuff
         //else get stuff from Contentful
         if(cacheContainsStuffBasedOnQuery) {
             return cachedStuff;
         }
    
         return _inner.GetEntries<T>(queryString, cancellationToken);
       }
    }
    

    如果您正在运行 ASP.NET Core,则可以使用装饰器模式在 startup.cs 中初始化您的客户端(没有 oob 支持,因此您必须手动进行)。

    services.AddTransient<IContentfulClient>((s) => {
                var httpClient = s.GetService<HttpClient>();
                var options = s.GetService<IOptions<ContentfulOptions>>();
                var contentfulClient = new ContentfulClient(httpClient, options);
                var cachingClient = new CachingContentfulClient(contentfulClient);
    
                return cachingClient;
            });
    

    话虽如此,来自 Contentful 的典型响应会非常非常快地返回。我设置了几个基准测试来测量这种类型的东西。这是获取空间的最新版本(这是一个非常简单的操作,获取条目和资产当然会稍微慢一些,但不会慢很多)。

             Method |     Mean |     Error |   StdDev |    Median |
    --------------- |---------:|----------:|---------:|----------:|
           GetSpace | 4.489 ms | 0.9696 ms | 20.82 ms | 2.0922 ms |
     GetSpaceCached | 2.075 ms | 0.9627 ms | 20.68 ms | 0.0003 ms |
    

    因此,虽然从缓存中获取某些内容显然非常快(这里的平均值有所偏差,因为第一个请求需要填充缓存,但一旦缓存被填充,大约需要 3-4 秒 nano ),获取空间的平均时间为 4 毫秒。通常,您的代码中还有其他瓶颈,需要比缓存 Contentful 响应更多的关注。

    【讨论】:

    • 我对 Robban 的回答非常感谢,这是我在 Stack Overflow 上收到的最好的回答之一。干杯!