redis缓存和数据库一致性

  • redis和数据库的双写一致性一直是个比较高频的面试题,今天来给大家说一说双写一致性
  • 一致性

  • 强一致性 : 对于用户来说 体验感最好,写入什么读取的就是什么
  • 弱一致性 : 系统不保证写入什么就读取什么,但会尽可能保证在一定的时间后可以保证写入的和读取的相同
  • 最终一致性 : 是业界推崇的模型,也是弱一致性的一种, 在一定的时间后 保证数据一致性
  • redis与数据库双写一致性

  • 一般来说, 写入的时候, 先写入数据库,在删除缓存
  • 抛出一个问题 , 为什么先写入数据库?可以先写入缓存吗? 以及可以先删除缓存,在更新数据库吗?

  • 第一个问题: 为什么先写入数据库?
  • 假设先写入缓存,A B 两个线程,A写入缓存 - > A写入数据库时候失败了->产生脏数据
  • A写入缓存->B写入缓存 ->B写入数据库成功->A写入数据库成功 : 导致不一致性
  • 先删除缓存,在更新数据库

  • A删除缓存->这时候B读取了数据库 并且把数据放入了缓存中->A更新了数据库 : 导致数据不一致
  • 解决双写一致性

  • 可以使用延时删除 , 先删除一遍缓存 ->更新数据库->隔了一定的时间 再次删除缓存
  • 如果二次删除失败怎么办呢?

  • 那么可以使用 mq 来进行重试操作, 可以使用rocketmq , rocketmq可以保证消息消费成功才会被删除

你可能感兴趣的:(redis,java,redis)