最重要的话
2021年,真希望行业能春暖花开。
去年由于疫情的影响,无数行业都受到了影响,互联网寒冬下,许多程序员被裁,大环境格外困难。
我被公司裁掉后,便着急地开始找工作,一次次地碰壁,完全消磨掉了自己的信心,突然感受到,面试已经越来越难了。
于是,我开始调整状态,着重于深耕技术知识,似乎一切开始了好转,最后斩获p7岗offer。
于是乎,我想把我的学习经历以及面试几十家互联网企业总结下来的面试经历分享给我的同行(Java程序员),希望你在金三银四,感受春暖花开!
如何保证缓存和数据库一致性
说了这么多缓存的必要性,那么使用缓存是不是就是一个很简单的事情了呢,我之前也一直是这么觉得的,直到遇到了需要缓存与数据库保持强一致的场景,才知道让数据库数据和缓存数据保持一致性是一门很高深的学问。
从远古的硬件缓存,操作系统缓存开始,缓存就是一门独特的学问。这个问题也被业界探讨了非常久,争论至今。我翻阅了很多资料,发现其实这是一个权衡的问题。值得好好讲讲。
以下的讨论会引入几方观点,我会跟着观点来写代码验证所提到的问题。
不更新缓存,而是删除缓存
大部分观点认为,做缓存不应该是去更新缓存,而是应该删除缓存,然后由下个请求去去缓存,发现不存在后再读取数据库,写入缓存。
观点引用:《分布式之数据库和缓存双写一致性方案解析》孤独烟
原因一:线程安全角度
同时有请求A和请求B进行更新操作,那么会出现
(1)线程A更新了数据库
(2)线程B更新了数据库
(3)线程B更新了缓存
(4)线程A更新了缓存
这就出现请求A更新缓存应该比请求B更新缓存早才对,但是因为网络等原因,B却比A更早更新了缓存。这就导致了脏数据,因此不考虑。
原因二:业务场景角度
有如下两点:
(1)如果你是一个