MST

星途 面试题库

面试题:缓存设计之实时风控系统缓存高可用与性能优化

在高并发的实时风控场景下,缓存可能成为性能瓶颈或出现单点故障。请设计一套方案,实现缓存系统的高可用性,并在保障数据一致性的前提下,最大程度地优化缓存读写性能,包括但不限于缓存集群搭建、负载均衡策略、缓存预热等方面的设计,并说明各部分的原理和优势。
42.1万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存集群搭建

  1. 分布式缓存集群:采用如 Redis Cluster 这样的分布式缓存方案。Redis Cluster 通过将数据分布在多个节点上,利用哈希槽(hash slot)机制,每个节点负责一部分哈希槽,来实现数据的分布式存储。
    • 原理:客户端计算数据的哈希值,通过对哈希值取模映射到对应的哈希槽,进而定位到存储该数据的节点。
    • 优势:有效扩展缓存容量,提高系统整体性能,每个节点都可以独立处理读写请求,提升了并发处理能力,同时具备一定的容错能力。
  2. 主从复制集群:在每个节点内部,采用主从复制的方式。以 Redis 为例,一个主节点负责写操作,多个从节点复制主节点的数据。
    • 原理:主节点将写操作日志以追加的方式记录下来,从节点通过同步主节点的日志来保持数据一致。
    • 优势:提高了数据的冗余度,从节点可以分担读请求,提升整体读性能,并且在主节点故障时,从节点可以晋升为主节点,保障系统可用性。

负载均衡策略

  1. 客户端负载均衡:在客户端代码中实现负载均衡逻辑,如使用一致性哈希算法。
    • 原理:一致性哈希算法将所有节点映射到一个固定长度的哈希环上,客户端根据数据的键计算哈希值,沿哈希环顺时针找到最近的节点进行读写操作。当有节点加入或离开时,只有该节点附近的少量数据会受影响。
    • 优势:减少了额外的负载均衡设备或服务的开销,提高了系统的灵活性和可扩展性,在一定程度上减轻了中心负载均衡器的压力。
  2. 代理层负载均衡:引入代理层如 Twemproxy 等,客户端请求先到代理层,代理层负责将请求转发到合适的缓存节点。
    • 原理:代理层维护节点信息和负载均衡算法,根据算法(如轮询、加权轮询等)将请求分配到不同的缓存节点。
    • 优势:对客户端透明,客户端无需感知后端缓存节点的变化,便于集中管理和维护,同时可以对请求进行统一的处理和监控。

缓存预热

  1. 启动时预热:在系统启动阶段,通过脚本或程序预先加载一些热点数据到缓存中。
    • 原理:提前将业务中经常访问的数据主动写入缓存,避免首次请求时缓存穿透到后端数据源。
    • 优势:在系统上线初期就能保证较高的缓存命中率,提升响应速度,减少后端数据源的压力。
  2. 定时预热:根据业务特点,设置定时任务,在特定时间(如业务低峰期)更新或补充缓存中的热点数据。
    • 原理:按照设定的时间周期,主动查询后端数据源获取最新数据并更新到缓存。
    • 优势:确保缓存数据的时效性,减少因数据过期导致的缓存失效问题,保障系统在不同时段都能维持良好性能。

数据一致性保障

  1. 读写锁机制:在对缓存数据进行读写操作时,使用读写锁。读操作可以并发进行,写操作则需要获取独占锁。
    • 原理:读锁允许多个线程同时读取数据,写锁则排斥其他读写操作,保证写操作的原子性,避免读写冲突导致的数据不一致。
    • 优势:在保证数据一致性的前提下,最大程度提高了读操作的并发性能。
  2. 缓存更新策略:采用先更新数据库,再更新缓存(或先删除缓存再更新数据库)的策略,并结合重试机制。
    • 原理:确保数据库中的数据始终是最新的,在更新数据库后,同步更新缓存,若更新失败则进行重试。删除缓存再更新数据库则是通过删除缓存标记,让下次请求重新从数据库加载数据到缓存。
    • 优势:保证了缓存与数据库数据的最终一致性,通过重试机制提高了更新操作的成功率。