You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Web API 2单次请求能否实现多时效内存缓存?

实现双层内存缓存的方案

当然可以实现!这种双层缓存的思路刚好能解决你的需求——既让Web API每次都能快速返回数据,又能严格控制对外部服务的调用频率(每2小时一次)。

核心逻辑说明

我们需要维护两个层级的内存缓存:

  • 5分钟短期缓存:优先供Web API请求快速读取,过期后自动从长期缓存刷新,不会触发外部API调用。
  • 2小时长期缓存:仅存储从外部API获取的原始数据,只有当它过期时,才会重新调用外部服务,之后同时更新两个层级的缓存。

这样就能保证:

  • Web API每次被调用时,优先用短期缓存快速响应
  • 外部API仅在长期缓存过期时被触发(每2小时一次)

代码实现示例

下面是基于ASP.NET Web API的具体代码实现,使用MemoryCache来管理两个缓存层级:

using System.Runtime.Caching;
using System.Net.Http;
using System.Threading.Tasks;

public class ProductsController : ApiController
{
    // 使用默认内存缓存实例
    private readonly MemoryCache _cache = MemoryCache.Default;
    // 建议将HttpClient注册为单例,避免频繁创建连接
    private static readonly HttpClient _httpClient = new HttpClient();

    public async Task<IHttpActionResult> GetProduct()
    {
        const string shortTermKey = "Product_ShortTerm";
        const string longTermKey = "Product_LongTerm";
        
        // 定义两个缓存的过期策略
        var shortTermPolicy = new CacheItemPolicy 
        { 
            AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(5) 
        };
        var longTermPolicy = new CacheItemPolicy 
        { 
            AbsoluteExpiration = DateTimeOffset.Now.AddHours(2) 
        };

        // 第一步:检查5分钟短期缓存,存在则直接返回
        var shortTermData = _cache.Get(shortTermKey);
        if (shortTermData != null)
        {
            return Ok(shortTermData);
        }

        // 第二步:短期缓存不存在,检查2小时长期缓存
        var longTermData = _cache.Get(longTermKey);
        if (longTermData != null)
        {
            // 将长期缓存数据同步到短期缓存,供后续请求快速获取
            _cache.Set(shortTermKey, longTermData, shortTermPolicy);
            return Ok(longTermData);
        }

        // 第三步:长期缓存也不存在,调用外部API获取数据
        var externalResponse = await _httpClient.GetAsync("https://www.domain.com/api/sss/ss/");
        externalResponse.EnsureSuccessStatusCode();
        var productData = await externalResponse.Content.ReadAsAsync<YourProductModel>();

        // 同时更新长期缓存和短期缓存
        _cache.Set(longTermKey, productData, longTermPolicy);
        _cache.Set(shortTermKey, productData, shortTermPolicy);

        return Ok(productData);
    }
}

关键注意事项

  • 缓存键区分:一定要用不同的缓存键来区分短期和长期缓存,避免数据覆盖。
  • HttpClient优化:示例中用了静态HttpClient,实际项目里建议通过依赖注入注册为单例,避免频繁创建HTTP连接导致资源浪费。
  • 异常处理:可以在调用外部API的部分添加异常捕获逻辑(比如网络超时、服务错误),避免缓存失效时导致Web API报错。
  • 缓存策略调整:如果需要滑动过期(比如用户频繁访问时延长缓存时间),可以修改CacheItemPolicy的SlidingExpiration属性,但你的需求用绝对过期更合适。

内容的提问来源于stack exchange,提问作者Mohamed Sahir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:20:58