如何实现数据库与缓存的高效同步策略?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1380个文字,预计阅读时间需要6分钟。
前言:在读取与写入缓存方面,大家都是这样做的:判断是否有缓存数据,若无数据则从数据库加载,若数据非空,则写入缓存,并将数据返回给调用方。但这里有一个问题需要分步解决。
前言:
在读取与写入缓存方面大家都是这么做的:判断是否有缓存数据,无数据的话从数据库加载,若查出数据不为null,则写入缓存,再把数据返回调用方。
但是这里有一个问题需要分析,缓存与数据库的同步,在更新完数据库后,是更新缓存还是删除缓存,还是先删缓存,再更新数据库。从理论上来说,设置过期时间是最终保持一致的解决方案。但是这不是最好的办法,在缓存有效期内或者高并发情况下,会很可能出现读取到的数据与缓存不一致的情况。
三种策略:
1.先更新数据库,再更新缓存
2.先删除缓存,再更新数据库
3.先更新数据库,再删除缓存
不会出现先更新缓存再更新数据库,如果更新数据库失败了,那就完了
1.先更新数据库,再更新缓存
这套方案不太好
a.线程安全角度
(1) 线程A更新了数据库
(2) 线程B更新了数据库
(3) 线程B更新了缓存
(4) 线程A更新了缓存
这样缓存中就出现了错误的数据库
b.业务场景
如果数据库写的场景比较多,读的场景比较少,就会出现数据库频繁更新,缓存频繁更新可能缓存根本就没有读,这样浪费性能
如果写入数据库的值,并不是直接写入缓存的,而是要经过一系列复杂的计算再写入缓存,那么每次写入数据库后,再次计算写入缓存,也是浪费性能的。删除缓存显得更为合适。
本文共计1380个文字,预计阅读时间需要6分钟。
前言:在读取与写入缓存方面,大家都是这样做的:判断是否有缓存数据,若无数据则从数据库加载,若数据非空,则写入缓存,并将数据返回给调用方。但这里有一个问题需要分步解决。
前言:
在读取与写入缓存方面大家都是这么做的:判断是否有缓存数据,无数据的话从数据库加载,若查出数据不为null,则写入缓存,再把数据返回调用方。
但是这里有一个问题需要分析,缓存与数据库的同步,在更新完数据库后,是更新缓存还是删除缓存,还是先删缓存,再更新数据库。从理论上来说,设置过期时间是最终保持一致的解决方案。但是这不是最好的办法,在缓存有效期内或者高并发情况下,会很可能出现读取到的数据与缓存不一致的情况。
三种策略:
1.先更新数据库,再更新缓存
2.先删除缓存,再更新数据库
3.先更新数据库,再删除缓存
不会出现先更新缓存再更新数据库,如果更新数据库失败了,那就完了
1.先更新数据库,再更新缓存
这套方案不太好
a.线程安全角度
(1) 线程A更新了数据库
(2) 线程B更新了数据库
(3) 线程B更新了缓存
(4) 线程A更新了缓存
这样缓存中就出现了错误的数据库
b.业务场景
如果数据库写的场景比较多,读的场景比较少,就会出现数据库频繁更新,缓存频繁更新可能缓存根本就没有读,这样浪费性能
如果写入数据库的值,并不是直接写入缓存的,而是要经过一系列复杂的计算再写入缓存,那么每次写入数据库后,再次计算写入缓存,也是浪费性能的。删除缓存显得更为合适。

