并发环境下,先操作数据库还是先操作缓存?
前言
在分布式系统中,缓存和数据库同时存在时,如果有写操作,先操作数据库还是先操作缓存呢?本文将分5种方案展开阐述对比,谢谢阅读~
缓存维护方案一
如果是一读(线程B)一写(线程A)操作,「先操作缓存,再操作数据库」。流程图如下所示:
1.线程A发起一个写操作,第一步del cache
2.线程A第二步写入新数据到DB 3.线程B发起一个读操作,cache miss缓存失效了。 4.线程B从DB获取最新数据 5.线程B执行set cache,把从DB读到的数据,更新到缓存。
1.线程A发起一个写操作,第一步del cache 2.此时线程B发起一个读操作,cache miss 3.线程B继续读DB,读出来一个老数据 4.然后老数据设置入cache 5.线程A写入DB最新的数据
缓存维护方案二
1.线程A发起一个写操作,第一步set cache 2.线程A第二步写入新数据到DB 3.线程B发起一个写操作,set cache 4.线程B第二步写入新数据到DB
1.线程A发起一个写操作,第一步set cache 2.线程B发起一个写操作,第一步set cache 3.线程B写入数据库到DB 4.线程A写入数据库到DB
缓存维护方案三
1.线程A发起一个写操作,第一步write DB 2.线程A第二步del cache 3.线程B发起一个读操作,cache miss 4.线程B从DB获取最新数据 5.线程B同时set cache
缓存维护方案四
缓存维护方案五
缓存维护总结
1.读取缓存中是否有相关数据 2.如果缓存中有相关数据value,则返回 3.如果缓存中没有相关数据,则从数据库读取相关数据放入缓存中key->value,再返回 4.如果有更新写数据,则先操作数据库,再操作缓存 5.为了保证第四步更新缓存成功,使用binlog异步通知操作 6.如果是主从数据库,binglog取自于从库 7.如果是一主多从,每个从库都要采集binlog,然后消费端收到最后一台binlog数据才删除缓存
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
评论