美文网首页java学习架构栈微服务实践
聊聊数据库和缓存同步机制

聊聊数据库和缓存同步机制

作者: ForestXie | 来源:发表于2017-07-24 19:56 被阅读197次

之前写了三篇关于秒杀的文章,里面提到了通过分布式缓存来缓解数据库压力。最近有朋友私信回复问,缓存和数据库是如何进行同步的,通过大家的问题,让我感到这个点确实可以聊一下,所以今天准备写一写,供大家做一个参考。

缓存同步的常用模式

缓存同步的模式,可以按照缓存的用途(主要用于读或者写)分为两类:读缓存的同步和写缓存的同步。

读缓存的同步:

缓存预加载模式

提前将数据从数据库加载到缓存,如果数据库有写更新,同步更新缓存。在秒杀情况下,我们对商品数据就按照这种模式进行处理。

缓存直读模式

应用先查看缓存中是否有该数据,有则直接使用,如果没有,从数据库加载,然后放入缓存,下次以后再访问就可以直接从缓存中获得。

写缓存的同步:

缓存直写模式

在数据更新时,同时写入缓存和数据库。这种模式是最稳妥的办法,但是性能会受到一定的影响。

缓存回写模式

在数据更新时只写入缓存。通常由一个后台队列检查缓存中数据的变化,再将据写到后端数据库。

如何避免缓存和数据库的数据不同步

上面介绍了缓存同步的模式,但光依靠模式,是不能完全阻止数据同步是没有问题的。比如说,有两个线程A和B,在并发情况下,他们如果能同时操作某条数据,由于同一个数据进行读写,在数据库层面并发的读写并不能保证完成顺序。就有可能导致数据库与缓存不同步。

所以在在缓存模式下,处理过程中,需要通过对该数据加锁,保证对数据的处理是严格按照串行处理的。

如何检查缓存和数据库的数据是同步的

1. 属性中增加一个版本号或者时间戳字段,每次更新缓存后,版本号+1或者取更新时间戳,下一次写操作前,先比较,然后再更新。

2. 建立一个定时任务,定义一个同步周期(5分钟或者15分钟),定时任务会对最近一个时间周期内数据库中更新过的数据进行比较,于缓存(例如redis)中的数据进行匹配和比较。

扫描二维码或手动搜索微信公众号【架构栈】: ForestNotes

相关文章

  • 聊聊数据库和缓存同步机制

    之前写了三篇关于秒杀的文章,里面提到了通过分布式缓存来缓解数据库压力。最近有朋友私信回复问,缓存和数据库是如何进行...

  • cache和主从库的数据不一致问题

    总结自https://coolshell.cn/articles/17416.html 缓存和数据库的同步机制,一...

  • 谈谈API版本控制的策略

    上篇写《聊聊数据库和缓存同步机制》的时候,收到一份读者留言,希望我来谈谈API开发过程中的版本控制。这是一个很好的...

  • Mybatis缓存机制详解2019-06-13

    mybatis缓存机制详解 mybatis提供了缓存机制减轻数据库压力,提高数据库性能 mybatis的缓存分为两...

  • 缓存

    内存缓存 数据库缓存 文件系统缓存 本地内存缓存 没有利用缓存机制之前,所耗费的时间 1. 数据库缓存 配置中间件...

  • mybatis缓存机制

    mybatis缓存机制 简介: mybatis提供查询缓存,用于减轻数据库压力,提高数据库性能 mybatis提供...

  • Redis缓存和MySQL数据库同步

    深度详解Redis缓存和MySQL数据库同步 - 知乎 (zhihu.com)[https://zhuanlan....

  • nginx 缓存(11)

    介绍nginx是如何设置缓存之前,我们还是先聊聊web浏览器的缓存机制。 1.浏览器缓存 浏览器的缓存机制也就是我...

  • Java缓存优化3 - 缓存同步、缓存穿透、缓存击穿、缓存雪崩的

    一、缓存同步问题 1. 缓存同步解决方案 1.1 数据实时同步 这种数据同步是增量、主动、强一致性 对数据库数据进...

  • 聊聊MyBatis缓存机制

    前言 MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓...

网友评论

  • 1cfdc66f787e:数据库和缓存都设置一个版本,然后维护版本一致性?
  • Nathans:写的话锁住数据库并发处,然后根据结果来设置缓存对吗?怎么获得一个周期内数据库的更新操作?按我的理解可以直接更新缓存设置标识,线程根据标识修改数据库,这样稍微好些,数据过多的话以数据库匹配缓存反倒不容易

本文标题:聊聊数据库和缓存同步机制

本文链接:https://www.haomeiwen.com/subject/iifikxtx.html