面试题答案
一键面试方案一:先更新数据库,再更新缓存
- 技术手段:在接收到用户点赞、评论请求时,先将数据持久化到数据库,成功后再更新缓存。
- 优点:操作相对简单,符合常规思维,能保证数据库与缓存最终一致性。
- 缺点:并发场景下,可能出现缓存更新失败,导致数据不一致。若先更新数据库成功,在更新缓存前系统崩溃,会造成缓存与数据库数据不一致。
方案二:先删除缓存,再更新数据库
- 技术手段:收到请求,先删除缓存数据,然后更新数据库。后续请求读取缓存时发现缓存不存在,从数据库加载最新数据并回种到缓存。
- 优点:实现相对容易,在大多数情况下能保证数据一致性。在高并发场景下,能避免方案一中缓存更新失败导致的不一致问题。
- 缺点:可能出现短暂的数据不一致。在删除缓存和更新数据库之间,若有其他读请求,会从数据库读到旧数据并回种到缓存,造成缓存数据不是最新的。
方案三:使用读写锁或分布式锁
- 技术手段:利用读写锁(在单机环境)或分布式锁(在分布式环境),保证同一时间只有一个写操作能执行。在更新数据时,先获取锁,更新数据库和缓存后再释放锁。读操作可并发执行,但在写锁占用时需等待。
- 优点:能有效保证数据一致性,在高并发场景下避免了缓存与数据库不一致的问题。
- 缺点:引入锁机制会降低系统并发性能,增加了系统复杂度。分布式锁实现较复杂,可能存在锁超时、死锁等问题。
方案四:异步更新缓存(消息队列)
- 技术手段:接收到用户操作请求,先更新数据库,然后将缓存更新任务发送到消息队列。由专门的消费者从消息队列中取出任务,更新缓存。
- 优点:将缓存更新操作异步化,不影响主业务流程,提高系统响应速度。能保证数据最终一致性,适合高并发场景。
- 缺点:增加了系统架构复杂度,需要引入消息队列中间件。可能存在消息丢失、重复消费等问题,需额外处理保证消息可靠性和幂等性。