
1) 【一句话结论】针对高频访问的API,应采用分层缓存(内存+数据库),结合LRU淘汰、TTL过期及主动失效策略,并设计布隆过滤器防穿透、随机过期防雪崩、互斥锁防击穿,以平衡性能与一致性。
2) 【原理/概念讲解】
老师口吻:移动端API缓存的核心是“快”与“稳”,需分层次设计。
3) 【对比与适用场景】
| 策略 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| LRU | 最近最少使用淘汰 | 优先淘汰最久未使用的数据 | 热点数据多,内存有限 | 需维护时间复杂度 |
| TTL | 时间过期 | 指定时间后自动失效 | 数据变化频率固定,过期时间明确 | 可能导致数据不一致 |
| 主动失效 | 业务逻辑触发删除 | 实时更新缓存 | 数据更新频繁,需立即同步 | 需额外通知机制 |
| 布隆过滤器 | 用于缓存穿透防御 | 确定数据不存在时快速返回 | 防止缓存穿透,减少无效请求 | 可能存在误判(假阳性) |
4) 【示例】
伪代码(用户信息查询缓存逻辑):
def get_user_info(user_id):
# 检查内存缓存(Redis)
user_info = redis.get(f"user:{user_id}")
if user_info:
return json.loads(user_info)
# 缓存未命中,查询数据库
user_info_db = db.query("SELECT * FROM users WHERE id = ?", user_id)
if user_info_db:
# 存入内存缓存,设置TTL(如1小时)
redis.setex(f"user:{user_id}", 3600, json.dumps(user_info_db))
return user_info_db
else:
return None
5) 【面试口播版答案】
(约90秒)
“面试官您好,针对高频访问的API(如用户信息查询),我会采用分层缓存策略。首先,缓存层次上,用内存缓存(如Redis)作为第一层,数据库作为第二层。缓存数据选择上,优先缓存用户信息、登录状态等热点数据。失效策略方面,结合TTL(比如1小时过期)和主动失效(用户信息更新时删除缓存),同时用LRU淘汰冷数据。然后处理常见问题:缓存穿透用布隆过滤器,缓存雪崩用随机过期时间,缓存击穿用互斥锁。具体来说,比如用户查询时,先查Redis,若没有再查数据库,存入Redis并设置TTL,用户信息更新时主动删除缓存。这样既能减少用户等待时间,又能保证系统在高并发下的稳定性。”
6) 【追问清单】
7) 【常见坑/雷区】