网站建设中的服务器搭建方式杭州数据推广
策略
先更新数据库,再删除缓存
为什么要删除缓存,而不是更新缓存?
考虑两件事:
- 缓存中的数据,可不都是从数据库中直接取出来的,有可能是多表联查,查出来的对吧。
- 你如果更新缓存,意味着要再算一次,那假如更新200个这样的缓存,那就是算200次。最致命的是,你更新了这个缓存,后面还不一定用得上。那如果删除缓存之后,如果后面需要用了,发现缓存里没有,就去数据库查询或者计算一次就行了。
这实际上是一种懒加载的思想,在Mybatis中缓存也是这样的思想。 想想操作系统中的时间局部性和空间局部性。
问题
‘先更新数据库,再删除缓存,也不是完全没有问题,当并发情况下,有一个查询线程A和更新线程B
(1)缓存刚好失效
(2)请求A查询数据库,得一个旧值
(3)请求B将新值写入数据库
(4)请求B删除缓存
(5)请求A将查到的旧值写入缓存
在经过上面的过程之后,会出现缓存旧值,数据库新值的情况,不过概率很小。
怎么解决呢?
首先,给缓存设有效时间是一种方案。其次,采用异步延时删除策略,保证读请求完成以后,再进行删除操作。
(1)先淘汰缓存
(2)再写数据库
(3)休眠1秒,再次淘汰缓存
如果删除缓存失败了怎么办?
补一个重试策略。