-
做数据查询时,缓存不存在的情况下,选择
淘汰缓存还是更新缓存
?
对应简单数据,两者都可以。对应复杂数据,一般选择淘汰缓存。
- 做数据更新(新增或者修改)时,选择先淘汰缓存,再更新数据库
原因:假如先更新数据库,再淘汰缓存,假如缓存淘汰失败,那么后面的请求都会得到脏数据,直至缓存过期。假如先淘汰缓存再更新数据库,如果数据库更新失败,只会产生一次缓存miss,相比较而言,后者对业务影响更小一点。
-
延时双删策略
3.1 如下场景:同时有一个请求A进行更新操作,另一个请求B进行查询操作。
(1)请求A进行写操作,删除缓存
(2)请求B查询发现缓存不存在
(3)请求B去数据库查询得到旧值
(4)请求B将旧值写入缓存
(5)请求A将新值写入数据库
次数便出现了数据不一致问题。采用延时双删策略得以解决
public void update(String key,Object data){
redisUtils.del(key);
db.update(data);
Thread.Sleep(100);
redisUtils.del(key);
}
这么做,可以将1秒内所造成的缓存脏数据,再次删除。这个时间设定可根据俄业务场景进行一个调节。
3.2 数据库读写分离的场景
两个请求,一个请求A进行更新操作,另一个请求B进行查询操作。
(1)请求A进行写操作,删除缓存
(2)请求A将数据写入数据库了,
(3)请求B查询缓存发现,缓存没有值
(4)请求B去从库查询,这时,还没有完成主从同步,因此查询到的是旧值
(5)请求B将旧值写入缓存
(6)数据库完成主从同步,从库变为新值
依旧采用延时双删策略解决此问题
版权声明:本文为yyqhwr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。