MST
星途 面试题库

面试题:缓存设计之专家难度:电商系统多级缓存设计与一致性维护

请设计一个适合电商系统的多级缓存架构,涵盖不同层次缓存的选型(如Redis、Memcached等)和用途。并阐述如何在多级缓存环境下维护数据一致性,尤其是在数据更新频繁且对一致性要求较高的场景中,需要考虑网络延迟、缓存失效等复杂情况。
40.5万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

多级缓存架构设计

  1. 前端缓存
    • 选型:浏览器缓存(如HTTP缓存)。
    • 用途:减少客户端对服务器的请求次数,对于不经常变化的静态资源(如图片、CSS、JavaScript文件等),浏览器可以直接从本地缓存中加载,提高页面加载速度,降低服务器负载。
  2. CDN缓存
    • 选型:使用专业的CDN服务提供商(如阿里、腾讯等的CDN服务)。
    • 用途:将内容缓存到离用户最近的边缘节点,加速用户访问。对于电商系统中的商品图片、视频等静态内容,CDN缓存能显著提高加载速度,同时减轻源站服务器压力。
  3. 应用层缓存
    • 一级缓存选型:Memcached。
      • 用途:适用于简单的键值对缓存,性能极高。常用于缓存一些短期高频访问的数据,如热门商品的基本信息(商品名称、价格等),这些数据更新频率相对较低,但访问量巨大,Memcached能快速响应请求,减少数据库压力。
    • 二级缓存选型:Redis。
      • 用途:功能丰富,支持多种数据结构(如哈希、列表、集合等)。用于缓存较复杂的数据,如商品详细描述、评论列表等。还可以利用Redis的发布订阅功能来实现缓存更新通知,并且支持持久化,在服务器重启后数据不会丢失。
  4. 数据库缓存
    • 选型:数据库自身的缓存机制(如MySQL的InnoDB Buffer Pool)。
    • 用途:缓存数据库数据页,减少磁盘I/O。当查询数据时,首先从数据库缓存中查找,如果命中则直接返回数据,提高数据库查询性能。

数据一致性维护

  1. 缓存更新策略
    • 读写锁策略:在数据更新频繁且对一致性要求较高的场景中,使用读写锁。读操作时允许多个线程同时读取缓存数据,但在写操作时,需要获取写锁,此时其他读写操作都被阻塞,直到写操作完成并更新缓存和数据库后释放锁。这样能保证数据在更新过程中的一致性。
    • 双写策略:当数据发生变化时,先更新数据库,然后立即更新所有层次的缓存。为了应对网络延迟等问题,可以采用异步更新缓存的方式,但要保证更新操作的可靠性。例如,使用消息队列(如RabbitMQ、Kafka等),将缓存更新任务发送到队列中,由专门的消费者来处理缓存更新,确保即使网络短暂故障,更新任务也不会丢失。
  2. 缓存失效处理
    • 设置合理的缓存过期时间:对于不同类型的数据,根据其更新频率设置不同的过期时间。对于更新频繁的数据,设置较短的过期时间,如热门商品的价格,可能每隔几分钟就需要更新,过期时间可以设置为5 - 10分钟;对于相对稳定的数据,如商品分类信息,过期时间可以设置得较长,如1 - 2天。
    • 主动失效:当数据发生更新时,不仅更新缓存数据,还主动使相关缓存失效。例如,使用Redis的发布订阅功能,当商品数据更新时,发布一条消息,所有订阅该商品缓存更新的服务都收到通知,主动删除对应的缓存数据,下次请求时重新从数据库加载并缓存。
  3. 缓存与数据库一致性校验
    • 定期校验:可以设置定时任务,定期从数据库中读取数据与缓存数据进行比对。如果发现不一致,及时更新缓存。例如,每隔1小时对重要的商品数据进行一次一致性校验。
    • 版本号控制:在数据库中增加版本号字段,每次数据更新时版本号递增。缓存数据中也保存版本号,在读取缓存数据时,将缓存版本号与数据库中的版本号进行比对,如果不一致则更新缓存。