MST
星途 面试题库

面试题:缓存设计之复杂业务场景下缓存数据过期机制的设计

在一个电商系统中,存在商品详情页缓存,不同商品的热度差异很大,且部分商品信息更新频率不同。设计一个缓存数据过期机制,既能保证热点数据的高命中率,又能及时更新变动的数据,同时尽量减少对系统性能的影响。请详细描述设计思路、关键实现步骤以及涉及到的技术点。
50.1万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 基于热度分类:根据商品热度将商品分为热点商品和普通商品。对于热点商品,由于其被频繁访问,要尽量保证缓存命中率,减少过期时间带来的缓存穿透。对于普通商品,可适当设置较短的过期时间以节省缓存空间。
  2. 更新频率结合:对于更新频率高的商品,不管其热度如何,都要确保能及时更新缓存数据。可以通过监听商品数据的更新事件,一旦有更新,立即刷新缓存。
  3. 性能考量:为了减少对系统性能的影响,缓存过期操作应尽量异步化,避免在处理业务请求时同步进行过期检查和数据更新,同时采用合理的数据结构和算法来管理缓存,降低缓存操作的时间复杂度。

关键实现步骤

  1. 热度统计
    • 在商品访问时记录访问次数。可以使用计数器,每次商品被访问,计数器加1。例如,在每次商品详情页请求处理逻辑中添加计数器自增操作。
    • 定时(如每小时、每天)根据访问次数对商品热度进行排序分类。将访问次数超过一定阈值的商品标记为热点商品。
  2. 缓存过期策略
    • 热点商品:设置较长的过期时间,例如数天甚至一周,同时为其添加一个“软过期”机制。即当过期时间到达时,先不立即删除缓存,而是标记为即将过期,当有请求访问该商品时,检查是否标记为即将过期,如果是则重新设置较长的过期时间并返回数据。这样可以在一定程度上保证热点数据的高命中率。
    • 普通商品:设置较短的过期时间,如几小时。当过期后,下次请求时从数据库重新获取数据并更新缓存。
  3. 数据更新监听
    • 建立消息队列(如 Kafka、RabbitMQ 等),当商品信息在数据库中更新时,发送一条包含商品标识的更新消息到消息队列。
    • 缓存服务监听消息队列,当收到更新消息时,立即删除对应商品的缓存数据,下次请求该商品时会重新从数据库加载最新数据并更新缓存。

涉及到的技术点

  1. 缓存技术:常用的缓存技术如 Redis,它支持丰富的数据结构(如 String、Hash 等),可用于存储商品详情数据。并且 Redis 有强大的过期时间设置功能,能满足不同商品的过期策略需求。
  2. 消息队列:Kafka、RabbitMQ 等消息队列技术,用于解耦商品数据更新和缓存更新操作,保证数据更新的及时性和系统的高可用性。消息队列可以异步处理消息,避免因缓存更新操作影响业务处理流程。
  3. 数据统计与排序:使用数据库或内存数据结构(如 Redis 的 Sorted Set)来记录商品访问次数并进行排序。在数据库中可以通过 SQL 的聚合函数进行统计,而 Redis 的 Sorted Set 可以方便地根据分数(这里即访问次数)进行排序。
  4. 异步处理:利用多线程、异步任务框架(如 Java 的 Spring Async、Python 的 Celery 等)来实现缓存过期操作和消息处理的异步化,减少对主业务线程的阻塞,提升系统性能。