MST

星途 面试题库

面试题:高并发下社交应用缓存设计的一致性问题

在社交应用中,高并发操作频繁,比如大量用户同时点赞、评论一条动态。此时既要保证缓存能快速响应请求,又要确保数据一致性。请描述你会采用哪些技术手段和设计模式来解决缓存与数据库之间的数据一致性问题,并且分析每种方案的优缺点。
44.2万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

方案一:先更新数据库,再更新缓存

  • 技术手段:在接收到用户点赞、评论请求时,先将数据持久化到数据库,成功后再更新缓存。
  • 优点:操作相对简单,符合常规思维,能保证数据库与缓存最终一致性。
  • 缺点:并发场景下,可能出现缓存更新失败,导致数据不一致。若先更新数据库成功,在更新缓存前系统崩溃,会造成缓存与数据库数据不一致。

方案二:先删除缓存,再更新数据库

  • 技术手段:收到请求,先删除缓存数据,然后更新数据库。后续请求读取缓存时发现缓存不存在,从数据库加载最新数据并回种到缓存。
  • 优点:实现相对容易,在大多数情况下能保证数据一致性。在高并发场景下,能避免方案一中缓存更新失败导致的不一致问题。
  • 缺点:可能出现短暂的数据不一致。在删除缓存和更新数据库之间,若有其他读请求,会从数据库读到旧数据并回种到缓存,造成缓存数据不是最新的。

方案三:使用读写锁或分布式锁

  • 技术手段:利用读写锁(在单机环境)或分布式锁(在分布式环境),保证同一时间只有一个写操作能执行。在更新数据时,先获取锁,更新数据库和缓存后再释放锁。读操作可并发执行,但在写锁占用时需等待。
  • 优点:能有效保证数据一致性,在高并发场景下避免了缓存与数据库不一致的问题。
  • 缺点:引入锁机制会降低系统并发性能,增加了系统复杂度。分布式锁实现较复杂,可能存在锁超时、死锁等问题。

方案四:异步更新缓存(消息队列)

  • 技术手段:接收到用户操作请求,先更新数据库,然后将缓存更新任务发送到消息队列。由专门的消费者从消息队列中取出任务,更新缓存。
  • 优点:将缓存更新操作异步化,不影响主业务流程,提高系统响应速度。能保证数据最终一致性,适合高并发场景。
  • 缺点:增加了系统架构复杂度,需要引入消息队列中间件。可能存在消息丢失、重复消费等问题,需额外处理保证消息可靠性和幂等性。