带你了解:高并发环境下,先操作数据库还是先操作缓存?
1)线程A发起一个写操作,第一步set cache 2)线程B发起一个写操作,第一步setcache 3)线程B写入数据库到DB 4)线程A写入数据库到DB 执行完后,缓存保存的是B操作后的数据,数据库是A操作后的数据,缓存和数据库数据不一致。 缓存维护方案三一写(线程A)一读(线程B)操作,先操作数据库,再操作缓存。 1)线程A发起一个写操作,第一步write DB 2)线程A第二步del cache 3)线程B发起一个读操作,cache miss 4)线程B从DB获取最新数据 5)线程B同时set cache 这种方案没有明显的并发问题,但是有可能步骤二删除缓存失败,虽然概率比较小,优于方案一和方案二,平时工作中也是使用方案三。 综上对比,我们一般采用方案三,但是有没有完美全解决方案三的弊端的方法呢? 缓存维护方案四这个是方案三的改进方案,都是先操作数据库再操作缓存,我们来看一下流程图:
通过数据库的binlog来异步淘汰key,以mysql为例,可以使用阿里的canal将binlog日志采集发送到MQ队列里面,然后通过ACK机制确认处理 这条更新消息,删除缓存,保证数据缓存一致性。 但是呢还有个问题,如果是主从数据库呢? (编辑:ASP站长网) |