MST
星途 面试题库

面试题:缓存设计之专家难度:复杂业务场景下缓存命中率深度优化

考虑一个复杂的金融交易系统,其中涉及多种交易类型(如股票交易、期货交易、外汇交易等),每种交易类型有不同的缓存需求和数据更新频率。同时,系统需要满足严格的实时性和数据一致性要求。在这样的业务场景下,设计一个缓存架构来最大化缓存命中率,要详细说明缓存层次设计、数据同步机制、缓存更新策略以及如何处理缓存与数据库之间的一致性问题,并且分析该架构在面对大规模并发交易时的性能瓶颈及应对策略。
12.5万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存架构设计

缓存层次设计

  1. 前端缓存:在客户端(如交易终端)设置缓存,缓存一些用户特定且不常变化的数据,如用户的个性化交易界面配置等。这样可以减少对后端服务的请求,加快响应速度。
  2. 应用层缓存:在应用服务器上设置本地缓存,例如使用 Ehcache 等。缓存热点数据,如最近频繁交易的股票基本信息、用户常用交易策略等。此层缓存可以快速响应大部分本地请求,减轻后端缓存和数据库压力。
  3. 分布式缓存:采用 Redis 等分布式缓存,缓存全局共享且频繁访问的数据,如市场实时行情数据(如股票价格、外汇汇率等)。分布式缓存可以通过集群方式扩展,满足高并发读写需求。

数据同步机制

  1. 主动推送:对于实时性要求极高的数据(如股票的实时价格变动),由数据源(如证券交易所接口)主动推送数据到分布式缓存,然后分布式缓存通过消息队列(如 Kafka)通知应用层缓存和前端缓存更新。
  2. 定时拉取:对于更新频率较低的数据(如期货合约的一些基本信息),应用层缓存定时从数据库拉取数据更新,并同步到分布式缓存和前端缓存。

缓存更新策略

  1. 写后更新:在交易发生时,先更新数据库,然后再更新缓存。这样可以保证数据库的一致性,但可能在短时间内出现缓存与数据库数据不一致的情况。
  2. 失效策略:对于更新频率高的数据,设置较短的缓存过期时间。当缓存过期后,再次请求时从数据库读取并更新缓存。
  3. 读写锁:在对缓存数据进行写操作时,加写锁,禁止其他读操作;写操作完成后,释放写锁。读操作时加读锁,允许多个读操作并发进行,但禁止写操作。

缓存与数据库一致性处理

  1. 事务机制:在进行交易操作时,将数据库更新和缓存更新放在一个事务中,确保要么都成功,要么都失败。
  2. 异步补偿:如果在更新缓存时出现失败,通过消息队列记录失败的操作,后续异步进行重试,保证缓存最终与数据库一致。

性能瓶颈及应对策略

性能瓶颈

  1. 缓存穿透:大量不存在的数据请求穿透缓存直接到达数据库,导致数据库压力过大。
  2. 缓存雪崩:缓存中大量数据同时过期,导致大量请求直接打到数据库,造成数据库过载。
  3. 缓存击穿:高并发情况下,缓存中某个热点数据过期瞬间,大量请求同时访问该数据,导致数据库压力激增。

应对策略

  1. 缓存穿透
    • 使用布隆过滤器,在请求到达缓存前,先通过布隆过滤器判断数据是否存在,不存在则直接返回,避免请求穿透到数据库。
    • 对查询结果为空的数据也进行缓存,设置较短的过期时间。
  2. 缓存雪崩
    • 为缓存数据设置随机过期时间,避免大量数据同时过期。
    • 启用二级缓存,当一级缓存失效时,二级缓存可以继续提供服务,减轻数据库压力。
  3. 缓存击穿
    • 对热点数据设置永不过期,或者在更新数据时采用双缓存策略,即新旧缓存交替使用,避免在更新瞬间出现缓存失效问题。
    • 使用互斥锁,在缓存过期时,只有一个请求能获取锁去查询数据库并更新缓存,其他请求等待,从而避免大量请求同时访问数据库。