MST
星途 面试题库

面试题:缓存设计之中等难度:缓存命中率优化策略基础应用

假设你正在开发一个电商系统,商品详情页面需要频繁读取数据。当前缓存命中率较低,你打算采用热点数据优先缓存策略来优化。请描述如何识别热点商品数据,以及在代码层面(以Python + Redis为例)如何实现热点商品数据优先缓存到Redis中,提高缓存命中率。
32.3万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

识别热点商品数据

  1. 基于访问频率:在系统中记录每个商品的访问次数,定期(如每小时、每天)统计访问次数,访问次数高的商品即为热点商品。例如,每次商品详情页被访问时,在数据库或日志中记录该商品的ID及访问时间等信息,之后进行统计分析。
  2. 基于购买频率:统计每个商品的购买次数,购买次数多的商品可视为热点商品。通过订单系统获取商品的购买记录,分析购买频率。
  3. 实时分析:使用流处理技术(如Apache Kafka结合Spark Streaming)实时分析用户行为数据,包括浏览、加购、购买等,实时识别出当前热点商品。

Python + Redis 实现热点商品数据优先缓存

import redis
import time

# 连接 Redis
r = redis.Redis(host='localhost', port=6379, db=0)

def get_product_detail(product_id):
    # 尝试从 Redis 中获取商品详情
    product_detail = r.get(product_id)
    if product_detail:
        return product_detail.decode('utf-8')

    # 如果 Redis 中没有,从数据库(假设为函数 get_product_detail_from_db)获取
    product_detail = get_product_detail_from_db(product_id)

    # 更新访问频率到 Redis(使用有序集合)
    current_time = time.time()
    r.zadd('product_access_frequency', {product_id: current_time})

    # 获取访问频率最高的前 N 个商品(假设 N = 10)
    hot_product_ids = r.zrevrange('product_access_frequency', 0, 9)

    # 将热点商品缓存到 Redis 并设置较长的过期时间(如 1 小时)
    for hot_product_id in hot_product_ids:
        hot_product_detail = get_product_detail_from_db(hot_product_id.decode('utf-8'))
        r.setex(hot_product_id, 3600, hot_product_detail)

    # 将当前商品缓存到 Redis 并设置较短的过期时间(如 10 分钟)
    r.setex(product_id, 600, product_detail)

    return product_detail


def get_product_detail_from_db(product_id):
    # 模拟从数据库获取商品详情
    return f"Product detail for {product_id}"
  1. 缓存获取逻辑:首先尝试从 Redis 中获取商品详情,如果获取到则直接返回。
  2. 数据库读取:如果 Redis 中没有,则从数据库获取商品详情。
  3. 记录访问频率:使用 Redis 的有序集合 product_access_frequency 记录每个商品的访问时间,时间戳越大表示越新访问,以此来体现访问频率。
  4. 识别热点商品:通过 zrevrange 获取访问频率最高的前 N 个商品ID。
  5. 缓存热点商品:将识别出的热点商品缓存到 Redis 并设置较长的过期时间,以提高缓存命中率。同时也将当前访问的商品缓存到 Redis,但设置较短的过期时间。