MST
星途 面试题库

面试题:缓存设计之复杂业务场景下缓存失效策略动态调整

假设你正在开发一个电商平台的后端系统,商品详情页数据缓存在Redis中。在促销活动期间,商品浏览量会急剧上升,且不同品类商品热度变化差异大。请设计一种缓存失效策略的动态调整机制,既能保证热门商品数据的快速响应,又能合理利用缓存空间,详细说明设计思路和实现步骤。
38.1万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 监控商品热度:通过记录商品的浏览次数来衡量热度。利用Redis的原子操作,每次商品被浏览时,对对应的浏览量计数器进行自增操作。
  2. 划分热度区间:根据商品的浏览量将商品划分为不同的热度区间,例如高热度、中热度、低热度。可以设定不同的阈值来区分这些区间,比如高热度商品的浏览量在过去一小时内超过1000次,中热度在100 - 1000次之间,低热度小于100次。
  3. 动态调整缓存失效策略
    • 高热度商品:设置较长的缓存过期时间,如数小时甚至数天,以减少缓存失效带来的数据库查询压力,保证快速响应。
    • 中热度商品:设置适中的缓存过期时间,如几十分钟到一小时不等,平衡缓存空间和响应速度。
    • 低热度商品:设置较短的缓存过期时间,如几分钟,以便及时释放缓存空间给更热门的商品。
  4. 定时任务:定时(如每隔一段时间,例如15分钟)根据商品的热度重新划分区间,并调整对应的缓存失效时间。

实现步骤

  1. 记录浏览量:在商品详情页的后端代码中,当用户访问商品详情时,使用Redis的INCR命令对该商品的浏览量计数器进行自增。例如,假设商品ID为product:123,可以使用INCR product:123:views
  2. 热度区间划分:编写一个脚本(如Python脚本结合Redis的Python客户端库),定期(如15分钟)执行。脚本遍历所有商品的浏览量数据,根据设定的阈值划分热度区间。例如:
import redis

r = redis.Redis(host='localhost', port=6379, db=0)
# 获取所有商品的浏览量
keys = r.keys('product:*:views')
for key in keys:
    views = int(r.get(key))
    product_id = key.decode('utf-8').split(':')[1]
    if views >= 1000:
        # 高热度商品
        r.setex(f'product:{product_id}:detail', 3600 * 24, r.get(f'product:{product_id}:detail'))  # 设置缓存过期时间为24小时
    elif views >= 100:
        # 中热度商品
        r.setex(f'product:{product_id}:detail', 3600, r.get(f'product:{product_id}:detail'))  # 设置缓存过期时间为1小时
    else:
        # 低热度商品
        r.setex(f'product:{product_id}:detail', 300, r.get(f'product:{product_id}:detail'))  # 设置缓存过期时间为5分钟
  1. 设置计划任务:使用操作系统的计划任务工具(如Linux下的crontab),定时执行上述脚本,实现缓存失效策略的动态调整。例如,在crontab中添加如下配置,每15分钟执行一次脚本:
*/15 * * * * python /path/to/script.py