写请求来了,要更新数据库和缓存,一前一后更新,就可能致使缓存和DB中的数据在一段时间内不一致。数据库
你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就必定会有数据一致性的问题,那么你如何解决一致性问题?缓存
通常来讲,就是若是你的系统不是严格要求缓存+数据库必须一致性的话,缓存能够稍微的跟数据库偶尔有不一致的状况,并发
若是是强一致性,读请求和写请求串行化,串到一个内存队列里去,这样就能够保证必定不会出现不一致的状况(效率极低。)异步
串行化以后,就会致使系统的吞吐量会大幅度的下降,用比正常状况下多几倍的机器去支撑线上的一个请求。spa
还有一种方式就是可能会暂时产生不一致的状况,可是发生的概率特别小,就是先更新数据库,而后再删除缓存。队列
这种状况不存在并发问题么?内存
不是的。假设这会有两个请求,一个请求A作查询操做,一个请求B作更新操做,那么会有以下情形产生资源
(1)缓存恰好失效
(2)请求A查询数据库,得一个旧值
(3)请求B将新值写入数据库
(4)请求B删除缓存
(5)请求A将查到的旧值写入缓存class
ok,若是发生上述状况,确实是会发生脏数据。效率
然而,发生这种状况的几率又有多少呢?
发生上述状况有一个先天性条件,就是步骤(3)的写数据库操做比步骤(2)的读数据库操做耗时更短,才有可能使得步骤(4)先于步骤(5)。但是,你们想一想,数据库的读操做的速度远快于写操做的(否则作读写分离干吗,作读写分离的意义就是由于读操做比较快,耗资源少),所以步骤(3)耗时比步骤(2)更短,这一情形很难出现。
如何解决上述并发问题?
首先,给缓存设有效时间是一种方案。其次,采用异步延时删除策略,保证读请求完成之后,再进行删除操做。