MST

星途 面试题库

面试题:缓存设计之Redis分布式缓存架构

设计一个基于Redis的分布式缓存架构,以支持大规模后端应用。要求考虑缓存的一致性、高可用性和扩展性。请描述整体架构设计,包括使用的Redis集群模式(如Redis Cluster、主从复制、哨兵模式等)、数据分片策略、缓存失效策略以及如何处理跨节点的数据一致性问题。同时,阐述在该架构下如何进行缓存预热和缓存迁移。
14.9万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

整体架构设计

  1. Redis集群模式:采用Redis Cluster模式,它是Redis的分布式解决方案,内置数据分片和高可用机制。在这种模式下,Redis节点通过Gossip协议交换状态信息,自动发现和维护节点关系。每个节点负责一部分数据槽(共16384个),数据通过CRC16算法计算后对16384取模,决定存储在哪个槽中。这种模式无需代理,客户端可以直接与任何节点通信,具备较好的扩展性和高可用性。
  2. 数据分片策略:基于Redis Cluster的内置数据分片机制,即按照数据槽分配数据。这种方式将数据均匀分布在各个节点上,每个节点负责管理一部分数据槽,避免了数据集中在某些节点上,提升了整体存储和读写能力。
  3. 缓存失效策略
    • 定时过期:对每个缓存数据设置过期时间,当到达过期时间时,该数据会被自动删除。可以在设置缓存时使用EXPIRE命令指定过期时间(单位为秒)。
    • 惰性删除:当客户端读取已过期的数据时,Redis会检查数据是否过期,如果过期则删除该数据,并返回空值。这种策略减少了删除过期数据的开销,但可能会导致过期数据在一段时间内仍然占用内存。
    • 定期删除:Redis会定期随机抽取一些键检查是否过期,如果过期则删除。通过调整定期删除的频率,可以在内存和CPU开销之间找到平衡。
  4. 跨节点数据一致性问题处理
    • 异步复制:Redis Cluster采用异步复制方式,主节点将写操作异步复制给从节点。虽然存在短暂的数据不一致,但这种方式保证了较高的写性能。从节点会尽可能快地同步主节点的数据。
    • Gossip协议:节点间通过Gossip协议交换状态信息,包括数据槽的分配、节点状态等。当节点状态发生变化(如主从切换)时,通过Gossip协议快速传播到其他节点,确保集群状态的一致性。

缓存预热

  1. 批量加载:在应用启动前,通过编写脚本从数据源(如数据库)中批量读取热点数据,并设置到Redis缓存中。可以使用Redis的MSET等批量操作命令,提高加载效率。
  2. 预加载任务:可以将缓存预热任务作为一个定时任务,在系统负载较低的时间段执行,避免对正常业务造成影响。例如,每天凌晨批量加载当天可能会频繁访问的数据。

缓存迁移

  1. 在线迁移:如果是在Redis Cluster内部节点之间迁移数据,可以使用Redis Cluster提供的CLUSTER SETSLOT <slot> IMPORTING <source_node_id>CLUSTER SETSLOT <slot> MIGRATING <target_node_id>命令,在不停止服务的情况下,将数据从一个节点迁移到另一个节点。迁移过程中,客户端仍然可以正常读写数据,Redis会自动处理数据的重定向。
  2. 数据同步:如果是从一个Redis集群迁移到另一个Redis集群,可以使用工具如redis - rdb - tools先将源集群的数据导出为RDB文件,然后将RDB文件导入到目标集群。或者使用Redis的SYNC命令进行数据同步,但这种方式可能会对源集群的性能产生一定影响,需要在合适的时间进行操作。同时,在迁移过程中,要注意处理好缓存的一致性问题,例如在迁移完成后,更新应用程序的配置,指向新的Redis集群。