面试题答案
一键面试1. 先更新数据库,再更新缓存
- 优点:
- 数据一致性相对较好,在正常情况下,数据库和缓存的数据能够保持同步更新。
- 缺点:
- 并发场景下可能出现数据不一致。比如在高并发时,线程A更新数据库后,线程B读取到更新前的缓存数据并返回,此时线程A还未来得及更新缓存,就会导致返回的数据不是最新的。
- 性能问题,如果更新操作频繁,每次更新都要操作数据库和缓存,可能会增加系统开销。
- 适用场景:并发量不高,对数据一致性要求极高,且更新操作不频繁的场景。例如某些金融系统中账户余额的更新场景,偶尔的账户余额调整操作,由于涉及资金安全,对数据一致性要求极高。
2. 先删除缓存,再更新数据库
- 优点:
- 简单直接,实现成本较低。
- 在高并发场景下,相比先更新数据库再更新缓存,减少了缓存更新失败导致数据不一致的风险,因为只要删除缓存成功,后续读取时就会从数据库加载最新数据并写入缓存。
- 缺点:
- 存在短暂的数据不一致窗口。在删除缓存和更新数据库之间,如果有读请求,会从数据库读取旧数据并写回缓存,导致缓存中数据不是最新的。
- 缓存击穿问题。如果在删除缓存后,更新数据库前,大量请求同时访问该数据,都从数据库读取数据,可能会对数据库造成较大压力。
- 适用场景:对数据一致性要求不是绝对严格,允许短暂的数据不一致,并发量较高的场景。例如电商系统中商品信息的更新,用户对于商品信息的显示在短时间内有轻微延迟是可以接受的。
3. 先更新数据库,再删除缓存
- 优点:
- 数据一致性相对较好,结合了先更新数据库的优势,确保数据库数据是最新的。同时相比先更新数据库再更新缓存,减少了缓存更新失败导致的数据不一致问题,因为只需要删除缓存。
- 对于读多写少的场景,能有效避免先删除缓存再更新数据库中可能出现的缓存击穿问题,因为读请求会在更新操作完成后从数据库加载最新数据到缓存。
- 缺点:
- 同样存在短暂的数据不一致窗口,在更新数据库和删除缓存之间,读请求会读到旧的缓存数据。
- 如果删除缓存操作失败,会导致数据不一致。比如网络故障等原因导致缓存删除失败,而数据库已更新,后续读请求会读到旧的缓存数据。
- 适用场景:读多写少,对数据一致性有一定要求,但允许短暂不一致的场景。如新闻资讯网站,新闻内容更新频率相对较低,且用户对新闻内容显示稍有延迟不太敏感,更注重读取性能。
4. 双写模式(更新数据库后,异步更新缓存)
- 优点:
- 对主业务逻辑影响较小,更新数据库操作可以快速返回,异步更新缓存不会阻塞业务流程,提高系统整体响应性能。
- 数据最终一致性能够得到保证,只要异步任务执行成功,缓存数据最终会和数据库一致。
- 缺点:
- 实现相对复杂,需要引入异步任务机制,如消息队列等,增加了系统的复杂度和维护成本。
- 存在异步任务失败的风险,如果异步更新缓存任务失败且没有重试机制,会导致数据不一致。
- 适用场景:对响应性能要求较高,对数据一致性要求相对较低,允许一定时间内数据不一致的场景。例如社交媒体平台中用户动态的更新,用户更在意发布动态操作的快速响应,而对于其他用户查看动态时稍有延迟不太敏感。