Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 407|回复: 0

高并发下缓存与数据库双写不一致解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-25 11:20:11 | 显示全部楼层 |阅读模式

    1、最初级的缓存不一致问题以及解决方案
    问题:先修改数据库,再删除缓存,如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据出现不一致。
    解决思路:
      先删除缓存,再修改数据库,如果删除缓存成功了修改数据库失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致,因为读的时候缓存没有,则读数据库中旧数据,然后更新到缓存中。

      

    2、并发下数据缓存不一致问题分析
    问题:
      第一个请求数据发生变更,先删除了缓存,然后要去修改数据库,此时还没来得及去修改;
      第二个请求过来去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中;
      第三个请求读取缓存中的数据 (此时第一个请求已经完成了数据库修改的操作)。
      完了,数据库和缓存中的数据不一样了。。。。

    问题分析:
      只有在对同一条数据并发读写的时候,才可能会出现这种问题。其实如果说你的并发量很低的话,特别是读并发很低,每天访问量就1万次,那么很少的情况下,会出现刚才描述的那种不一致的场景;但如果每天的是上亿的流量,每秒并发读是几万,每秒只要有数据更新的请求,就可能会出现上述的数据库+缓存不一致的情况。
    解决思路
      数据库的缓存更新与读取操作进行串行化,一个队列对应一个工作线程,每个工作线程串行拿到对应的操作,然后一条一条的执行。
      1. 首先我们的项目里维护一组线程池和内存队列。
      2. 更新数据的时候,根据数据的唯一标识将请求路由到一个jvm队列中,去更新数据库,然后请求结束。
      3. 读取数据的时候,先查缓存,如果发现数据不在缓存中,那么将根据唯一标识路由之后,也发送同一个jvm内部的队列中,重新读取数据库后更新缓存,最后请求结束。

       

      这里有一个需要优化的点,比如一个队列中,连续存在多个更新缓存请求串在一起是没意义的,这样重复的查询数据库并更新缓存的操作应该优化:如果发现队列中已经有一个更新缓存的请求了,那么就不用再放个更新请求操作进去了,直接让后面的读请求阻塞个200ms左右(这里只是举个例子,实际值可以根据服务的响应时间和机器的处理能力来计算),然后再次查询缓存,如果缓存没有值就查数据库,拿到结果后不用更新缓存,直接返回给页面即可。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 19:48 , Processed in 0.064639 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表