青岛开发区制作网站公司,培训教育网站开发,唐山网址建站,丽水公司网站建设1. 缓存穿透#xff08;Cache Penetration#xff09; 定义#xff1a;大量请求查询 数据库中不存在的数据#xff0c;导致请求绕过缓存直接访问数据库#xff0c;造成数据库压力过大。 场景#xff1a; 恶意攻击#xff1a;例如用不存在的用户ID频繁请求。 业务误操作…1. 缓存穿透Cache Penetration 定义大量请求查询 数据库中不存在的数据导致请求绕过缓存直接访问数据库造成数据库压力过大。 场景 恶意攻击例如用不存在的用户ID频繁请求。 业务误操作系统逻辑错误导致生成无效查询如负数ID。 解决方案 缓存空值对数据库查询为空的Key缓存一个空对象如Null并设置较短过期时间。 // 示例代码缓存空值
public String getData(String key) {String value cache.get(key);if (value null) {value db.query(key);if (value null) {cache.put(key, NULL, 60); // 缓存空值60秒} else {cache.put(key, value);}}return NULL.equals(value) ? null : value;
} 布隆过滤器Bloom Filter在缓存层前加布隆过滤器快速判断Key是否存在拦截无效请求。 接口限流与校验对请求参数做合法性校验如ID范围对异常IP限流。
2. 缓存击穿Cache Breakdown 定义某个热点Key在缓存过期瞬间大量并发请求直接穿透到数据库导致数据库瞬时压力激增。 场景 热搜话题、秒杀商品等热点数据过期。 缓存重建时间较长如复杂计算。 解决方案 永不过期 异步更新对热点Key设置逻辑永不过期后台异步刷新。 // 示例逻辑永不过期实际值带过期时间异步续期
public String getHotData(String key) {String value cache.get(key);if (value null) {value reloadHotData(key); // 触发异步加载}return value;
} 互斥锁Mutex Lock缓存未命中时通过分布式锁控制单线程重建缓存。 // 示例Redis分布式锁RedLock
public String getDataWithLock(String key) {String value cache.get(key);if (value null) {if (redisLock.tryLock(key)) {try {value db.query(key); // 双重检查防止重复查询cache.set(key, value);} finally {redisLock.unlock(key);}} else {Thread.sleep(100); // 等待后重试return getDataWithLock(key);}}return value;
} 缓存预热在高峰前提前加载热点数据。
3. 缓存雪崩Cache Avalanche 定义大量缓存Key同时过期 或 缓存服务宕机导致所有请求涌向数据库引发级联故障。 场景 缓存服务器重启。 批量数据设置相同过期时间如凌晨刷新缓存。 解决方案 随机过期时间在基础过期时间上增加随机值分散Key失效时间。 // 示例设置随机过期时间30分钟±随机10分钟
int expireTime 1800 new Random().nextInt(600);
cache.set(key, value, expireTime); 集群高可用使用Redis Cluster或Sentinel保证缓存层高可用。 多级缓存结合本地缓存如Caffeine和分布式缓存减少对单一缓存的依赖。 // 示例多级缓存本地Redis
public String getDataMultiLevel(String key) {String value localCache.get(key);if (value null) {value redis.get(key);if (value ! null) {localCache.put(key, value);} else {value db.query(key);redis.set(key, value, 3600);localCache.put(key, value);}}return value;
} 降级熔断通过Hystrix或Sentinel实现请求限流和熔断保护数据库。
对比总结
问题类型触发条件核心影响典型解决方案缓存穿透查询不存在的数据数据库被无效查询压垮布隆过滤器、缓存空值、参数校验缓存击穿热点Key过期数据库瞬时高并发互斥锁、逻辑永不过期、缓存预热缓存雪崩大量Key同时失效或服务宕机数据库持续高压随机过期时间、多级缓存、集群高可用 实际应用建议 监控与告警实时监控缓存命中率、数据库QPS设置阈值告警。 压测验证通过模拟高并发场景测试缓存策略的有效性。 动态调整根据业务变化如突发流量动态调整缓存策略如自动延长热点数据过期时间。