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

Azure APIM可选缓存优化咨询:寻求替代cache-lookup-value的高效方案

优化APIM可选缓存实现方案

一、修复原生缓存策略的性能问题

你之前用cache-lookup-value出现性能下降,大概率是因为该策略针对单个值的缓存操作,频繁调用会增加缓存交互开销,且没有结合完整的缓存读写流程。改用APIM原生的cache-lookup+cache-store组合策略,能实现更高效的整响应缓存,同时满足请求头控制的需求:

核心策略代码

<!-- 先判断请求头是否开启缓存 -->
<choose>
    <when condition="@(context.Request.Headers.ContainsKey("X-Enable-Cache") && 
        context.Request.Headers.GetValueOrDefault("X-Enable-Cache", "").Equals("true", StringComparison.OrdinalIgnoreCase))">
        <!-- 解析自定义缓存时长,默认300秒 -->
        <set-variable name="cacheDuration" value="@(int.TryParse(context.Request.Headers.GetValueOrDefault("X-Cache-Duration", "300"), out var d) ? d : 300)" />
        <!-- 生成缓存键:结合请求路径、查询参数,如需用户隔离可追加令牌 -->
        <set-variable name="cacheKey" value="@($"{context.Request.Url.PathAndQuery}_{context.Request.Headers.GetValueOrDefault("Authorization", "")}")" />
        <!-- 优先从缓存读取 -->
        <cache-lookup vary-by-developer="false" vary-by-developer-groups="false" 
            caching-type="internal" key="@((string)context.Variables["cacheKey"])" />
        <!-- 缓存未命中时,后端响应后写入缓存 -->
        <cache-store duration="@((int)context.Variables["cacheDuration"])" 
            caching-type="internal" key="@((string)context.Variables["cacheKey"])" />
    </when>
    <otherwise>
        <!-- 默认不启用缓存,直接转发请求 -->
        <forward-request />
    </otherwise>
</choose>

性能优化说明

  • 用cache-lookup/cache-store针对整个响应做缓存,单次读写操作比多次cache-lookup-value更高效
  • 缓存键设计尽量简洁,避免冗余计算:如果接口无需用户隔离,可去掉令牌部分,提升缓存命中率
  • 原生internal缓存是APIM托管的内存/磁盘缓存,延迟比外接Redis更低,适合大部分场景

二、外接Redis缓存方案(原生缓存受限场景)

如果需要跨APIM实例共享缓存、更大的缓存容量或自定义缓存过期策略,可以接入外部Redis:

步骤与策略代码

  1. 在APIM门户的「缓存」选项中,添加外部Redis实例,记录配置的cache-id
  2. 修改策略为使用外部缓存:
<choose>
    <when condition="@(context.Request.Headers.ContainsKey("X-Enable-Cache") && 
        context.Request.Headers.GetValueOrDefault("X-Enable-Cache", "").Equals("true", StringComparison.OrdinalIgnoreCase))">
        <set-variable name="cacheDuration" value="@(int.TryParse(context.Request.Headers.GetValueOrDefault("X-Cache-Duration", "300"), out var d) ? d : 300)" />
        <set-variable name="cacheKey" value="@($"{context.Request.Url.PathAndQuery}_{context.Request.Headers.GetValueOrDefault("Authorization", "")}")" />
        <!-- 指定使用外部Redis缓存 -->
        <cache-lookup vary-by-developer="false" vary-by-developer-groups="false" 
            caching-type="external" cache-id="your-redis-cache-id" key="@((string)context.Variables["cacheKey"])" />
        <cache-store duration="@((int)context.Variables["cacheDuration"])" 
            caching-type="external" cache-id="your-redis-cache-id" key="@((string)context.Variables["cacheKey"])" />
    </when>
    <otherwise>
        <forward-request />
    </otherwise>
</choose>

三、性能排查要点

你之前用cache-lookup-value性能下降的常见原因:

  • 频繁调用该策略获取多个值,导致多次缓存交互
  • 缓存键设计过于复杂,每次生成键的计算开销大
  • 未配合缓存存储逻辑,导致缓存命中率极低,反而增加额外操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 17:02:50