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