面试题答案
一键面试缓存与数据库一致性策略
- 先更新数据库,再更新缓存
- 操作步骤:用户发布新内容时,首先将数据持久化到数据库,成功后再更新相应的缓存数据。
- 优点:逻辑相对简单,易于理解和实现。
- 缺点:在并发场景下,可能出现先更新缓存,后更新数据库失败的情况,导致缓存与数据库数据不一致。
- 先删除缓存,再更新数据库
- 操作步骤:用户发布新内容,先删除对应的缓存数据,然后进行数据库更新操作。
- 优点:相对减少了不一致的窗口时间,因为数据库更新成功后,下次读取会重新从数据库加载数据到缓存。
- 缺点:在高并发场景下,如果在删除缓存和更新数据库之间有大量读请求,可能导致大量请求直接穿透到数据库。
- 先更新数据库,再延迟删除缓存
- 操作步骤:用户发布新内容,先更新数据库,成功后设置一个延迟任务,在一定时间后删除缓存。
- 优点:能在保证数据一致性的同时,减少高并发下读请求穿透到数据库的风险。因为在数据库更新成功到删除缓存这段时间内,读请求仍从缓存获取旧数据。
- 缺点:引入了延迟任务机制,增加了系统复杂度,需要考虑延迟任务的可靠性等问题。
避免缓存雪崩、缓存击穿和缓存穿透对Feed流展示影响的方法
- 缓存雪崩
- 设置不同的过期时间:避免大量缓存同时过期。可以在原过期时间基础上,增加一个随机的小偏移量,使得缓存过期时间分散开来。
- 使用二级缓存:一级缓存失效时,从二级缓存获取数据。二级缓存可以采用不同的存储介质(如硬盘)或不同的缓存策略(如永不过期)。
- 缓存预热:在系统上线前,提前将热点数据加载到缓存中,并设置合理的过期时间,避免系统刚上线时大量缓存未加载导致的雪崩问题。
- 缓存击穿
- 互斥锁:当一个热点数据过期时,只允许一个线程去查询数据库并更新缓存,其他线程等待。这样可以避免大量请求同时穿透到数据库。
- 热点数据永不过期:对于非常热点的数据,可以不设置过期时间,定期在后台异步更新缓存数据,保证数据的实时性。
- 缓存穿透
- 布隆过滤器:在查询数据前,先通过布隆过滤器判断数据是否存在。如果不存在,直接返回,避免请求穿透到数据库。布隆过滤器存在一定的误判率,但可以通过合理设置参数来降低误判概率。
- 缓存空值:当查询数据库发现数据不存在时,也将空值缓存起来,并设置较短的过期时间。下次查询同样的数据时,直接从缓存返回空值,避免重复查询数据库。