【JAVA架构师成长之路】【Redis】第14集:Redis缓存穿透原理、规避、解决方案
30分钟自学教程:Redis缓存穿透原理与解决方案
目标
- 理解缓存穿透的成因及危害。
- 掌握布隆过滤器、空值缓存等核心防御技术。
- 能够通过代码实现请求拦截与缓存保护。
- 学会限流降级、异步加载等应急方案。
教程内容
0~2分钟:缓存穿透的定义与核心原因
- 定义:恶意或异常请求频繁访问数据库中不存在的数据,绕过缓存直接冲击数据库。
- 典型场景:
- 攻击者伪造大量非法ID(如负数、超长字符串)。
- 业务未对查询参数校验,或未缓存空结果。
- 危害:
- 数据库压力激增,甚至宕机。
- 正常服务被恶意请求拖垮。
2~5分钟:代码模拟穿透场景(Java示例)
// 未做防护的查询方法(模拟穿透问题)
public Product getProduct(String id) {
String key = "product:" + id;
Product product = redisTemplate.opsForValue().get(key);
if (product == null) {
// 直接查询数据库(未缓存空值)
product = productService.loadFromDB(id);
if (product != null) {
redisTemplate.opsForValue().set(key, product, 1, TimeUnit.HOURS);
}
}
return product; // 恶意请求会反复查询数据库
}
验证问题:
- 使用JMeter发送100次
id=-1
的请求,观察数据库查询次数是否为100次(穿透发生)。
5~12分钟:解决方案1——布隆过滤器(Bloom Filter)
- 原理:基于位数组和哈希函数,快速判断数据是否可能存在于数据库,拦截非法请求。
- 代码实现(Redisson布隆过滤器):
// 初始化布隆过滤器并预热合法数据