MST
星途 面试题库

面试题:缓存设计之高级难度:缓存与CDN结合的策略优化

在高并发且数据更新频繁的场景下,缓存与CDN结合时可能会遇到缓存一致性和数据过期问题。请详细说明你会采用哪些策略来优化缓存和CDN的配置,以确保数据的准确性和高效分发,同时尽量减少缓存穿透、缓存雪崩等情况的发生?
46.1万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存一致性策略

  1. 缓存更新策略
    • 写后更新缓存:在数据库更新成功后,立即更新缓存。这种方式实现简单,但在高并发写场景下可能导致缓存与数据库短暂不一致。例如,在电商商品库存更新场景中,先更新数据库库存,再更新缓存库存。
    • 读写锁:对缓存读写操作加锁,写操作时锁定缓存,不允许读操作,直到写操作完成解锁。这能保证数据一致性,但会降低系统并发性能。比如在金融账户余额更新场景,写余额时加锁防止其他读操作读到旧数据。
    • 异步更新缓存:使用消息队列,数据库更新成功后发送消息到队列,由专门的消费者异步更新缓存。这样可以减少写操作的响应时间,但增加了系统复杂度。以新闻发布系统为例,发布新新闻时数据库更新成功后,消息队列异步更新缓存中的新闻列表。
  2. 版本控制 为缓存数据添加版本号,每次数据更新时版本号递增。客户端读取缓存数据时,同时获取版本号,再次请求时带上版本号,若版本号不一致则重新获取数据。如在线文档编辑场景,文档内容更新后版本号增加,用户端通过版本号判断是否获取新内容。
  3. 缓存标记 当数据更新时,在缓存中设置一个标记位,告知后续读取请求数据已更新,需要重新获取。比如在论坛帖子更新场景,更新帖子后在缓存中设置标记,用户读取帖子缓存时发现标记则重新从数据库获取最新内容。

数据过期问题策略

  1. 合理设置过期时间 根据数据的更新频率和重要性设置不同的过期时间。对于更新频繁但不太重要的数据,设置较短过期时间,如微博热门话题,可能每几分钟更新一次,过期时间设为5 - 10分钟;对于相对稳定的数据,如网站底部版权信息,设置较长过期时间,如1 - 7天。
  2. 随机过期时间 为避免大量缓存同时过期导致缓存雪崩,给缓存设置一个随机的过期时间范围。例如,原本设置过期时间为1小时,可以改为在50 - 70分钟内随机过期,这样可以分散过期时间,降低缓存雪崩风险。
  3. 缓存预热 在系统启动时,预先加载部分重要数据到缓存中,避免系统刚启动时大量请求穿透到数据库。如电商系统启动时,预加载热门商品信息到缓存。

避免缓存穿透策略

  1. 布隆过滤器 在缓存之前使用布隆过滤器,将所有可能存在的数据哈希到一个足够大的位数组中。查询时先通过布隆过滤器判断数据是否存在,若不存在则直接返回,避免穿透到数据库。例如在用户ID查询场景,使用布隆过滤器过滤不存在的用户ID查询。
  2. 空值缓存 当查询数据在数据库中不存在时,也将空值缓存起来,并设置较短的过期时间,避免后续相同查询穿透到数据库。如查询不存在的商品评论时,缓存空评论结果并设置1 - 5分钟过期时间。

避免缓存雪崩策略

  1. 分级缓存 采用多级缓存架构,如一级缓存使用内存缓存(如Redis),二级缓存使用分布式缓存(如Memcached)。当一级缓存失效时,先从二级缓存获取数据,减少数据库压力。以大型网站图片缓存为例,一级缓存存热门图片,二级缓存存相对不那么热门图片。
  2. 缓存熔断 设置一个阈值,当缓存失效请求达到一定数量时,暂时停止从缓存获取数据,直接返回默认值或错误信息,避免大量请求压垮数据库。例如电商促销活动时,当缓存失效请求每分钟超过1000次,触发缓存熔断机制。
  3. 依赖隔离 对不同业务或数据的缓存进行隔离,避免某个缓存出现问题影响整个系统。比如将用户信息缓存、商品信息缓存等分开管理,某个商品缓存雪崩不影响其他业务缓存。