为什么是删除缓存,而不是更新缓存?

简介: 理由如下

原因很简单,很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。

比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。


另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于比较复杂的缓存数据计算的场景,就不是这样了。

如果你频繁修改一个缓存涉及的多个表,缓存也频繁更新。但是问题在于,这个缓存到底会不会被频繁访问到?


举个栗子,一个缓存涉及的表的字段,在 1 分钟内就修改了 20 次,或者是 100 次,那么缓存更新 20 次、100 次;但是这个缓存在 1 分钟内只被读取了 1 次,有大量的冷数据。

实际上,如果你只是删除缓存的话,那么在 1 分钟内,这个缓存不过就重新计算一次而已,开销大幅度降低。用到缓存才去算缓存。


其实删除缓存,而不是更新缓存,就是一个 lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。像 mybatis,hibernate,都有懒加载思想。

查询一个部门,部门带了一个员工的 list,没有必要说每次查询部门,都里面的 1000 个员工的数据也同时查出来啊。80%的情况,查这个部门,就只是要访问这个部门的信息就可以了。先查部门,同时要访问里面的员工,那么这个时候只有在你要访问里面的员工的时候,才会去数据库里面查询1000个员工。


最初级的缓存不一致问题及解决方案


问题:先更新数据库,再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致。


1.png


解决思路:先删除缓存,再更新数据库。如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新到缓存中。



比较复杂的数据不一致问题分析


数据发生了变更,先删除了缓存,然后要去修改数据库,此时还没修改。一个请求过来,去读缓存,发现缓存空了,去查询数据库,查到了修改前的旧数据,放到了缓存中。随后数据变更的程序完成了数据库的修改。

完了,数据库和缓存中的数据不一样了……

相关文章
|
缓存 小程序 JavaScript
微信小程序删除缓存数组中的数据方法
微信小程序删除缓存数组中的数据方法
1178 0
|
消息中间件 存储 canal
到底是先更新数据库还是先更新缓存?
很多小伙伴最近都在问我,在系统中引入缓存后,当向数据库中写入数据时,是先写数据库还是先写缓存呢?先写数据库和先写缓存有什么区别吗?今天,我们就一起来聊聊这个话题。
261 0
到底是先更新数据库还是先更新缓存?
|
缓存 Java
【多线程:cas】原子更新器 原子累加器 缓存一致性问题
【多线程:cas】原子更新器 原子累加器 缓存一致性问题
141 0
|
缓存 Java fastjson
实战监听Eureka client的缓存更新
Spring cloud环境中的应用,如果注册到Eureka server,就会从Eureka server获取所有应用的注册信息(也叫服务列表),然后保存到本地,这个操作是周期性的,默认每三十秒一次,今天咱们来通过实战将其观察得清清楚楚
284 0
实战监听Eureka client的缓存更新
|
缓存 前端开发 NoSQL
关于缓存更新的一些可借鉴套路
目前随着缓存架构方案越来越成熟化,通常做法是引入「缓存」来提高读性能,架构模型就变成了这样:
关于缓存更新的一些可借鉴套路
|
消息中间件 存储 canal
到底是先更新数据库还是先更新缓存?
各系统存储的数据量越来越大,数据的查询性能越来越低。此时,就需要我们不断的进行优化,一种常用的优化手段就是引入缓存。而引入缓存后,我们在向数据库插入数据时,到底是先更新数据库还是先更新缓存呢?
671 1
到底是先更新数据库还是先更新缓存?
|
缓存 数据库 Memcache
你是如何更新缓存的?看懂这篇缓存读写策略(上)
你是如何更新缓存的?看懂这篇缓存读写策略
175 0
你是如何更新缓存的?看懂这篇缓存读写策略(上)
|
存储 消息中间件 缓存
你是如何更新缓存的?看懂这篇缓存读写策略(下)
你是如何更新缓存的?看懂这篇缓存读写策略
186 0
你是如何更新缓存的?看懂这篇缓存读写策略(下)
|
存储 缓存
运用惰性删除和定时删除实现可过期的localStorage缓存
使用localStorage可以在浏览器中存储键值对的数据。经常被和localStorage一并提及的是sessionStorage,它们都可以在当浏览器中存储键值对的数据。但是它们之间的区别是:存储在localStorage的数据可以长期保留;而当页面会话结束(也就是当页面被关闭)时,存储在sessionStorage的数据会被清除。
375 0