
1) 【一句话结论】:高并发交易系统中,应对缓存雪崩、穿透、击穿需通过**预加载(预热)、布隆过滤器(防穿透)、热点数据预热(防击穿)**等组合策略,结合分布式锁、限流、多级缓存,分场景针对性优化,避免单一策略失效。
2) 【原理/概念讲解】:
3) 【对比与适用场景】:
| 问题类型 | 定义 | 典型成因 | 典型场景 | 优化策略 |
|---|---|---|---|---|
| 缓存雪崩 | 大量缓存失效,请求直连数据库 | 统一过期时间、系统重启 | 系统维护时 | 预热、分布式锁、限流、多级缓存 |
| 缓存穿透 | 无效key导致缓存/数据库无结果 | 恶意攻击、无效查询 | 查询不存在的数据 | 布隆过滤器、缓存空值、热点预热 |
| 缓存击穿 | 热点key失效,请求直连数据库 | 热点key过期、并发写入 | 热门数据访问 | 预热、分布式锁、多级缓存 |
4) 【示例】(以用户登录和股票数据为例):
def load_hot_data():
users = db.query_all_users() # 从数据库加载所有用户
for user in users:
cache.set(f"user:{user.id}", user, timeout=3600) # 预热用户数据
def query_user_by_id(user_id):
if bf.contains(f"user:{user_id}"): # 检查布隆过滤器
data = cache.get(f"user:{user_id}")
if data: return data
else: return None # 缓存空值
else: return "用户不存在" # 误判为false
def get_stock_price(stock_id):
key = f"stock:{stock_id}"
with distributed_lock(key): # 分布式锁
if not cache.exists(key):
price = db.get_stock_price(stock_id) # 从数据库获取
cache.set(key, price, timeout=300) # 热点数据预热
return cache.get(key)
5) 【面试口播版答案】:
面试官您好,针对高并发交易系统中的缓存问题,核心是通过组合策略应对雪崩、穿透、击穿。
首先,缓存雪崩是缓存统一过期导致大量请求直连数据库,解决用预加载(系统启动时加载热点数据,如用户信息、热门股票),结合分布式锁控制并发写入,避免重复加载;同时限流防雪崩扩散。比如用户登录后,将用户数据提前存入缓存,后续请求直接从缓存获取,减少数据库压力。
其次,缓存穿透是无效key(如不存在的用户ID)导致数据库压力,用布隆过滤器,先检查缓存是否存在该key,若为false则直接返回“不存在”,避免数据库查询。比如查询用户时,先通过布隆过滤器判断,若为false则跳过数据库。
最后,缓存击穿是热点key(如热门股票)失效,用热点数据预热,提前加载到缓存,设置短失效时间(如5分钟),并加分布式锁保证并发写入时不会重复加载。比如股票数据更新时,用锁控制并发,避免重复查询数据库。
总结来说,通过预加载、布隆过滤器、热点预热结合缓存策略,可有效应对高并发下的缓存问题。
6) 【追问清单】:
7) 【常见坑/雷区】: