面试题答案
一键面试先更新数据库,再更新缓存
- 策略描述:在执行数据更新操作时,先对MySQL数据库进行更新,成功后再更新Redis缓存中的数据。
- 优点:
- 逻辑简单,易于理解和实现。在正常情况下,能够保证数据库和缓存数据的一致性。
- 缺点:
- 并发问题:在高并发场景下,如果有多个更新操作同时进行,可能会出现缓存更新顺序错乱的情况。例如,请求A先更新数据库,请求B后更新数据库,但请求B更新缓存的操作比请求A快,就会导致缓存中的数据不是最新的数据库数据。
- 性能问题:每次更新都需要操作数据库和缓存,增加了系统的响应时间,特别是在缓存和数据库不在同一台服务器时,网络开销会更大。
先删除缓存,再更新数据库
- 策略描述:在数据更新操作时,首先删除Redis缓存中的数据,然后再对MySQL数据库进行更新。
- 优点:
- 解决并发更新缓存错乱问题:相较于先更新数据库再更新缓存,这种方式避免了缓存更新顺序错乱的问题。因为先删除缓存,后续读取数据时会从数据库中重新加载并更新缓存,保证缓存数据是最新的。
- 性能较好:删除缓存操作通常比更新缓存操作要快,减少了整体的响应时间。
- 缺点:
- 缓存击穿问题:如果在删除缓存和更新数据库之间,有大量的读请求进来,由于缓存中数据已删除,这些请求都会直接打到数据库上,可能会导致数据库压力瞬间增大,甚至崩溃。
- 数据短暂不一致:在删除缓存后,更新数据库前这段时间内,如果有读请求,读到的是旧数据,会出现短暂的数据不一致情况。
先更新数据库,再删除缓存
- 策略描述:执行数据更新操作时,先更新MySQL数据库,更新成功后再删除Redis缓存中的数据。
- 优点:
- 并发性能较好:在高并发场景下,这种策略相对稳定。因为数据库的写操作本身就是串行化的(通过事务等机制保证数据一致性),先更新数据库后删除缓存,不会像先更新缓存那样出现并发更新缓存的一致性问题。
- 数据最终一致性:最终能保证缓存和数据库的数据一致性,后续读请求会重新加载最新数据到缓存。
- 缺点:
- 数据短暂不一致:同先删除缓存再更新数据库一样,在更新数据库后删除缓存前,读请求可能读到旧的缓存数据,造成短暂的数据不一致。
- 缓存击穿风险:如果在更新数据库成功后,删除缓存失败,也会出现缓存击穿问题,大量读请求直接访问数据库。需要引入重试机制或补偿机制来解决删除缓存失败的情况。