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