缓存一致性的问题(redis + mysql)

  • 最近在学习redis的相关知识, 学习到了redis和mysql的数据一致性问题
  1. 保证mysql和数据库的双写一致性的时候, 通常有如下两种策略

    • 先删缓存再写mysql
    • 先更新mysql再删缓存
  2. 并且先更新缓存再更新mysql的策略是不太被推荐的, 但是如果场景是例如发红包的时候, 那么生成红包和抢红包这个事情一般都是在redis中先完成, 然后再同步到mysql中(使用mq辅助), 那么这个好像就是先更新缓存再更新mysql的策略

所以想问一下, 是否在实际的开发过程中, 需要将先更新缓存再更新mysql先更新mysql再删缓存两种策略结合起来

  • 针对于发红包的整体流程也就是 : redis修改 -> mq到mysql写入数据库 -> canal又监听到mysql的修改 -> mq到redis来删除缓存更新数据
阅读 2k
2 个回答

维护缓存一致性的最佳实践是 先更新mysql再删缓存 + TTL cache 。前者使得出现不一致的窗口最小,后者可以保证最终一致性。

你对缓存一致性的理解是没问题的,但是你列举的抢红包场景放在这可能不是特别合适,一般抢红包的场景不会这么做.一般是把金额首先生成一个list,比如发十个红包总共10块钱,那么先把这十个红包的金额随机生成后塞在redis的list中,用户抢一个就pop一下,基于list的pop操作是原子性 这样就能防止并发出现多发的问题.这样高并发问题就解决了.用户增加余额并不会对数据库造成什么压力,如果想再保险点也可以引入mq,这样就算list pop成功,数据库更新失败也能保证数据最终一致性.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题