在我们的 OJ 平台中,为了保护数据库、提升响应速度,我设计了一套缓存防护体系:
缓存穿透:
针对恶意请求或不存在的题目 ID,我们用布隆过滤器提前过滤掉无效请求,误判率控制在 0.13% 以下,保护数据库不被大量无效查询压垮。
缓存雪崩:
对题目列表、分类数据等热点缓存,我们采用随机 TTL 避免同时过期,并结合 Caffeine 本地缓存 + Redis 分布式缓存的分级架构,减少 Redis 压力,提升访问速度。
缓存击穿:
对比赛排行榜、热门题目详情等热点 key,我们采用逻辑过期 + 互斥锁的方式,保证即使缓存过期,也只有一个线程去数据库加载数据,其他请求返回旧数据,避免数据库瞬间压力过大。
热点数据优化通过预加载和多级缓存,我们将首页、排行榜等热点数据的响应时间控制在 5ms 以内,提升了用户体验。