面试题答案
一键面试缓存架构设计思路
- 本地缓存:通常选择如 Guava Cache 这类轻量级、快速的本地缓存。主要用于存储高频访问且相对稳定的数据,减少对分布式缓存和后端数据源的压力。
- 分布式缓存:选用如 Redis 这样性能卓越、功能丰富的分布式缓存。用于存储大规模的数据,并且在多服务器间共享,以支持高并发访问。
数据在两种缓存间的分配策略
- 冷热数据区分:对于访问频率极高且变化频率低的热数据,优先放入本地缓存。而对于大量访问频率相对较低或变化较频繁的数据,存储在分布式缓存中。
- 根据业务场景:例如,一些配置信息、基础字典数据等可以放在本地缓存;而用户相关的动态数据、订单数据等放在分布式缓存。
更新策略
- 本地缓存:
- 主动更新:当数据发生变化时,主动通知相关服务器更新本地缓存。
- 定期刷新:设置一定的时间间隔,定期从分布式缓存或数据源重新加载数据到本地缓存。
- 分布式缓存:
- 写后更新:在数据更新到持久化存储后,立即更新分布式缓存。
- 异步更新:使用消息队列等机制,在数据更新后异步地更新分布式缓存,以减少对业务操作的影响。
避免缓存穿透问题
- 布隆过滤器:在查询数据前,先通过布隆过滤器判断数据是否存在。如果布隆过滤器判断不存在,则直接返回,不再查询缓存和数据库,避免无效查询穿透到数据库。
- 空值缓存:当查询数据库发现数据不存在时,将空值也缓存起来,并设置较短的过期时间,防止后续相同的无效查询穿透。
避免缓存雪崩问题
- 设置不同过期时间:对分布式缓存中的数据设置不同的过期时间,避免大量数据在同一时间过期,导致所有请求直接落到数据库。
- 使用二级缓存:除了分布式缓存,再添加一层如 CDN 这样的二级缓存,分担分布式缓存失效时的压力。
- 限流与降级:对访问量进行限流,防止瞬间大量请求涌入。当缓存失效导致压力过大时,进行服务降级,返回兜底数据或提示信息。