并发环境下,先操作数据库还是先操作缓存?
前言 在分布式系统中,缓存和数据库同时存在时,如果有写操作的时候,先操作数据库还是先操作缓存呢?先思考一下,可能会存在哪些问题,再往下看。下面我分几种方案阐述。 缓存维护方案一 假设有一写(线程A)一读(线程B)操作, 先操作缓存,在操作数据库 。,如下流程图所示: 1)线程A发起一个写操作,第一步del cache 2)线程A第二步写入新数据到DB 3)线程B发起一个读操作,cache miss, 4)线程B从DB获取最新数据 5)请求B同时set cache 这样看,没啥问题 。我们再看第二个流程图,如下: 1)线程A发起一个写操作,第一步del cache 2)此时线程B发起一个读操作,cache miss 3)线程B继续读DB,读出来一个老数据 4)然后老数据入cache 5)线程A写入了最新的数据 OK,酱紫,就有问题了吧,老数据入到缓存了, 每次读都是老数据啦,缓存与数据与数据库数据不一致 。 缓存维护方案二 双写操作, 先操作缓存,在操作数据库 。 1)线程A发起一个写操作,第一步set cache 2)线程A第二步写入新数据到DB 3)线程B发起一个写操作,set cache, 4)线程B第二步写入新数据到DB 这样看,也没啥问题。 ,但是有时候可能事与愿违,我们再看第二个流程图,如下: 1)线程A发起一个写操作,第一步set cache 2)线程B发起一个写操作