MST

星途 面试题库

面试题:缓存设计 - 热点数据识别与缓存策略

假设你有一个电商系统,商品浏览量是判断热点数据的重要依据。请描述如何设计一个缓存策略,能够快速识别出浏览量高的商品,并将其缓存起来,同时要考虑缓存的更新机制,避免数据不一致问题。
37.0万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试
  1. 缓存策略设计
    • 使用合适的缓存数据结构
      • 可以选用Redis作为缓存工具,利用其有序集合(Sorted Set)数据结构。有序集合的每个元素都关联一个分数(score),可以将商品的浏览量作为分数,商品ID作为元素。这样,通过ZRANGEBYSCORE命令,可以很方便地获取浏览量高(分数高)的商品ID。例如,假设商品ID为product:1,浏览量为100,使用ZADD product_views 100 product:1命令将其添加到有序集合product_views中。
    • 缓存粒度
      • 对于商品信息的缓存,可以以商品ID为键,将商品的详细信息(如名称、价格、描述等)作为值存储在缓存中。例如,在Redis中使用SET product:1 "{\"name\":\"商品1\",\"price\":100,\"description\":\"这是商品1的描述\"}"。这样在获取热点商品时,可以直接根据商品ID从缓存中获取详细信息,提高响应速度。
    • 缓存淘汰策略
      • 选择合适的缓存淘汰策略,如LRU(最近最少使用)或LFU(最不经常使用)。在Redis中,可以通过配置maxmemory-policy参数来设置淘汰策略。例如,如果设置为maxmemory-policy allkeys - lru,当缓存达到最大内存限制时,Redis会根据LRU算法淘汰最近最少使用的键值对,确保缓存空间的合理利用。
  2. 缓存更新机制
    • 实时更新浏览量
      • 当用户浏览商品时,在数据库中增加商品浏览量的同时,也要实时更新缓存中的浏览量。例如,在Redis中,当用户浏览商品product:1时,使用ZINCRBY product_views 1 product:1命令将该商品在有序集合中的浏览量分数加1。
    • 数据一致性保证
      • 采用双写策略:在更新数据库的商品浏览量后,紧接着更新缓存中的商品浏览量。为了防止在更新数据库成功但更新缓存失败的情况,可以引入重试机制。例如,使用一个重试队列,将更新缓存失败的操作放入队列中,后台任务不断从队列中取出任务进行重试,直到成功更新缓存。
      • 缓存失效时间设置:为缓存中的商品信息设置一个合理的失效时间(TTL)。例如,设置为1小时。当缓存失效后,下次请求该商品信息时,先从数据库中获取最新数据,然后更新到缓存中,这样可以在一定程度上保证数据的一致性。在Redis中可以使用SET product:1 "{商品信息}" EX 3600命令设置product:1这个键值对的失效时间为3600秒(1小时)。