MST

星途 面试题库

面试题:缓存设计之Feed流缓存一致性处理

在社交网络Feed流系统中,用户发布新内容后需要更新缓存以保证数据一致性。请详细阐述你会采用什么策略来确保缓存和数据库之间的一致性,并且说明在高并发场景下如何避免缓存雪崩、缓存击穿和缓存穿透问题对Feed流展示造成影响。
50.3万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

缓存与数据库一致性策略

  1. 先更新数据库,再更新缓存
    • 操作步骤:用户发布新内容时,首先将数据持久化到数据库,成功后再更新相应的缓存数据。
    • 优点:逻辑相对简单,易于理解和实现。
    • 缺点:在并发场景下,可能出现先更新缓存,后更新数据库失败的情况,导致缓存与数据库数据不一致。
  2. 先删除缓存,再更新数据库
    • 操作步骤:用户发布新内容,先删除对应的缓存数据,然后进行数据库更新操作。
    • 优点:相对减少了不一致的窗口时间,因为数据库更新成功后,下次读取会重新从数据库加载数据到缓存。
    • 缺点:在高并发场景下,如果在删除缓存和更新数据库之间有大量读请求,可能导致大量请求直接穿透到数据库。
  3. 先更新数据库,再延迟删除缓存
    • 操作步骤:用户发布新内容,先更新数据库,成功后设置一个延迟任务,在一定时间后删除缓存。
    • 优点:能在保证数据一致性的同时,减少高并发下读请求穿透到数据库的风险。因为在数据库更新成功到删除缓存这段时间内,读请求仍从缓存获取旧数据。
    • 缺点:引入了延迟任务机制,增加了系统复杂度,需要考虑延迟任务的可靠性等问题。

避免缓存雪崩、缓存击穿和缓存穿透对Feed流展示影响的方法

  1. 缓存雪崩
    • 设置不同的过期时间:避免大量缓存同时过期。可以在原过期时间基础上,增加一个随机的小偏移量,使得缓存过期时间分散开来。
    • 使用二级缓存:一级缓存失效时,从二级缓存获取数据。二级缓存可以采用不同的存储介质(如硬盘)或不同的缓存策略(如永不过期)。
    • 缓存预热:在系统上线前,提前将热点数据加载到缓存中,并设置合理的过期时间,避免系统刚上线时大量缓存未加载导致的雪崩问题。
  2. 缓存击穿
    • 互斥锁:当一个热点数据过期时,只允许一个线程去查询数据库并更新缓存,其他线程等待。这样可以避免大量请求同时穿透到数据库。
    • 热点数据永不过期:对于非常热点的数据,可以不设置过期时间,定期在后台异步更新缓存数据,保证数据的实时性。
  3. 缓存穿透
    • 布隆过滤器:在查询数据前,先通过布隆过滤器判断数据是否存在。如果不存在,直接返回,避免请求穿透到数据库。布隆过滤器存在一定的误判率,但可以通过合理设置参数来降低误判概率。
    • 缓存空值:当查询数据库发现数据不存在时,也将空值缓存起来,并设置较短的过期时间。下次查询同样的数据时,直接从缓存返回空值,避免重复查询数据库。