故障复盘|阿里云Redis缓存穿透引发跨境接口高频报错问题优化-阿里云开发者社区
一、业务背景与痛点
Taocarts跨境系统货品查询、库存查询接口QPS极高,大量不存在的货品ID、非法参数请求直接穿透缓存,频繁查询数据库。高峰期无效查询占比超30%,严重消耗数据库性能,引发接口延迟、报错增多,影响正常用户访问。
二、问题分析
1、空数据无缓存,非法请求每次穿透至DB;
2、无布隆过滤器拦截非法Key;
3、参数校验不严格,大量无效请求进入业务层。
三、解决方案
1、空值缓存短期过期,杜绝频繁穿透;
2、基于Redis实现简易布隆过滤器,拦截非法货品ID;
3、前置参数强校验,拦截无效请求。
四、核心优化代码
/**
缓存穿透防护工具类
Taocarts货品查询防穿透优化
*/
@Component
public class StockCacheProtectService {
@Autowired
private StringRedisTemplate redisTemplate;
// 空值缓存5分钟
private static final long EMPTY_CACHE_TIME = 5 * 60L;
public StockDO getStockWithProtect(String goodsId){
String key = "taocarts:stock:" + goodsId;
String cache = redisTemplate.opsForValue().get(key);
// 空值缓存拦截
if("empty".equals(cache)){
return null;
}
if(StringUtils.isNotEmpty(cache)){
return JSON.parseObject(cache, StockDO.class);
}
// 查询数据库
StockDO stock = stockMapper.selectById(goodsId);
if(stock == null){
// 缓存空值,防穿透
redisTemplate.opsForValue().set(key,"empty",EMPTY_CACHE_TIME,TimeUnit.SECONDS);
return null;
}
redisTemplate.opsForValue().set(key,JSON.toJSONString(stock));
return stock;
}
}
五、优化效果
1、数据库无效查询下降90%;
2、缓存穿透问题彻底解决;
3、接口报错率大幅下降,稳定性显著提升。
六、总结
高并发查询接口必须做缓存穿透防护,空值缓存+布隆过滤器是低成本、高收益的标准优化方案,适合所有电商、跨境查询类系统。