数据库和缓存一致性问题

99 阅读2分钟

1、写操作,先写redis,再写DB

问题:如果写DB失败,则redis中的数据没法回滚,脏数据,不可行

2、写操作,先写DB,再写redis

问题:a:高并发下,数据不一致问题
		  1、如果线程A,先写DB成功,写redis的过程中出现网络卡顿, 线程B写完redis后,线程A再写redis,导致数据不是最新的。
		  2、后一个请求线程B,先写DB成功,写redis成功。
      b:同时有2个写操作,如果是大数据量的话,会造成资源浪费。
	  c:如果是写多读少的场景,如果每次都双写,有点得不偿失。

3、先删redis,再写DB

问题:a:高并发下,数据不一致问题
		  1、线程A写操作,先删redis,写DB网络卡主了,线程B更新完缓存后,线程A网络恢复,然后更新缓存,导致缓存中的值不是最新值了。
		  2、线程B读,先查redis,发现没有,再写DB成功,然后更新缓存。
如何解决:延时双删,先删redis,再写DB,隔一段时间(500ms),再删redis(如果这个时候失败了怎么办?)

4、先写DB,在删redis

问题:a: 高并发下
		  1、线程A先写DB后,网络卡顿,线程B读完后,写缓存。似乎问题不大
		  2、此时线程B来读redis,发现有缓存,则返回。
      b: 高并发下(这种情况比较少,线程A的更新缓存 一般来说 是比线程B 先写DB,在写缓存快的)
		1、线程A来读redis,发现缓存失效了,然后查DB,然后更新缓存(此时网络卡顿了),然后更新redis成功(此时的值是旧值)
		2、线程A查完DB后,此时线程B写DB,然后删除redis。
		
PS:上面如果删redis失败了,加重试机制,订阅binlog