面试题答案
一键面试缓存选型
- 性能角度
- Memcached:适合简单的 key - value 存储场景,在高并发下性能卓越,数据存储在内存中,读写速度极快。例如在简单的网页缓存场景,能快速响应请求,减少后端数据库压力。
- Redis:功能丰富,除了基本的 key - value 存储,还支持多种数据结构如 List、Set、Hash 等。其单线程模型结合多路 I/O 复用技术,在处理复杂业务逻辑时,性能也能得到保障。如电商场景下,可利用 Hash 结构存储商品详细信息。
- 数据持久化
- Redis:提供 RDB 和 AOF 两种持久化方式。RDB 适合大规模数据恢复,AOF 则能保证数据的完整性。在需要数据持久化且对数据完整性有要求的业务中,Redis 更具优势,如金融交易记录缓存。
- 集群支持
- Redis:原生支持 Cluster 集群模式,通过数据分片实现水平扩展。Memcached 本身没有原生集群方案,通常需要依赖客户端实现一致性哈希来进行集群部署。在大规模数据和高并发场景下,Redis 的集群模式更易于管理和扩展。
缓存集群架构设计
- 主从复制
- Redis:主节点负责写操作,从节点复制主节点数据。当主节点出现故障时,可手动或通过 Sentinel 机制将从节点晋升为主节点,保证系统可用性。例如在一个新闻资讯平台,主节点接收新文章缓存写入,从节点负责为大量读请求提供数据。
- 哨兵模式
- 在 Redis 主从架构基础上,引入 Sentinel 节点。Sentinel 节点定期监控主从节点健康状态,当主节点故障时,自动进行故障转移,选举新的主节点。多个 Sentinel 节点之间通过 gossip 协议交换信息,防止单个 Sentinel 节点故障导致监控失效。
- Cluster 集群模式
- Redis Cluster:采用数据分片(hash slot)的方式,将数据分布在多个节点上。每个节点负责一部分 hash slot,客户端可直接与任意节点通信,通过计算 key 的 hash 值确定数据所在节点。这种架构可线性扩展,适合海量数据和高并发场景,如大型电商的商品缓存。
缓存穿透、雪崩、击穿的预防与应对
- 缓存穿透
- 布隆过滤器:在查询缓存和数据库之前,先通过布隆过滤器判断 key 是否存在。布隆过滤器利用多个哈希函数对 key 进行映射,将结果存储在位数组中。如果布隆过滤器判断 key 不存在,则直接返回,避免查询数据库。如在用户 ID 校验场景,可提前将已存在的用户 ID 通过布隆过滤器处理。
- 缓存空值:当查询数据库发现数据不存在时,将空值缓存起来,并设置较短的过期时间。这样后续相同查询直接从缓存返回空值,减少数据库压力。但要注意过期时间设置,避免长时间占用缓存空间。
- 缓存雪崩
- 分散过期时间:避免大量缓存同时过期。为每个缓存设置一个随机的过期时间范围,如在原本过期时间基础上,增加或减少一定的随机时间(例如 1 - 10 分钟)。这样可使缓存过期时间分散,降低集中过期导致的数据库压力。
- 使用二级缓存:一级缓存采用高可用架构(如 Redis Cluster),二级缓存可使用简单的本地缓存(如 Guava Cache)。当一级缓存失效时,先从二级缓存获取数据,减少对数据库的访问频率。
- 缓存击穿
- 互斥锁:在查询数据库前,先获取一个互斥锁。只有获取到锁的线程才能查询数据库并更新缓存,其他线程等待。锁释放后,其他线程从缓存获取数据。例如在抢购活动中,防止单个热点商品缓存失效时大量请求同时查询数据库。
- 永不过期:对于热点数据设置永不过期,定期在后台异步更新缓存数据。这样可避免缓存过期瞬间的高并发请求直接打到数据库。如热门电影的详情缓存,可采用这种方式保证缓存的高可用性。