面试题答案
一键面试1. 先更新数据库,再更新缓存
- 优点:操作相对直观,符合一般的读写思维逻辑,实现起来较为简单。
- 缺点:
- 并发问题:在高并发场景下,可能出现缓存与数据库数据不一致的情况。比如线程A更新数据库后,线程B读取数据库数据并写入缓存,此时线程A还未来得及更新缓存,导致缓存中数据为旧数据。
- 性能问题:每次更新都需要操作数据库和缓存,性能相对较低,如果缓存和数据库存在网络延迟等问题,会进一步影响系统响应速度。
2. 先删除缓存,再更新数据库
- 优点:
- 简单高效:相比先更新数据库再更新缓存,减少了一次写缓存操作,在一定程度上提高了系统性能。
- 解决部分并发问题:在高并发场景下,先删除缓存能在一定程度上避免缓存与数据库数据不一致问题。因为后续读取数据时发现缓存不存在,会从数据库加载并重新写入缓存。
- 缺点:
- 短暂不一致问题:在删除缓存和更新数据库之间,如果有其他线程读取数据,会从数据库读取到旧数据并写入缓存,导致缓存和数据库数据短暂不一致。
- 缓存击穿问题:如果删除缓存后,数据库发生异常未能成功更新,而此时大量请求过来读取数据,由于缓存不存在,会直接请求数据库,可能造成数据库压力过大甚至崩溃。
3. 先更新数据库,再删除缓存
- 优点:
- 数据一致性较好:在大多数情况下能够保证数据库和缓存数据的一致性,因为是先更新数据库成功后再删除缓存,后续读取会从数据库加载最新数据并更新到缓存。
- 减少无效写操作:相比于先更新缓存再更新数据库,减少了缓存的无效更新。因为只有数据库更新成功才会去删除缓存,若数据库更新失败,缓存不会被误更新。
- 缺点:
- 并发问题:在高并发场景下,仍然存在极小概率的数据不一致情况。比如线程A更新数据库成功后,在删除缓存前,线程B读取数据并将旧数据写入缓存,然后线程A再删除缓存,此时缓存中数据为旧数据。
- 删除失败问题:如果删除缓存操作失败,可能导致缓存数据一直为旧数据,影响数据一致性。可以通过重试机制或采用消息队列等方式来解决删除失败问题,但这增加了系统的复杂性。