进入电商公司以后,缓存用的实在太多了。特别是最近做的项目,整个数据都是直接从其他电商平台拉取的,全部放在Redis中。
想起了去年跳槽时众多面试的一场,面试官问我如何避免缓存脏读问题:
假设某个数据缓存在Redis中,当我在后台更新了数据后,如何保证客户端读取的是最新的数据呢?
问题描述:什么是缓存脏读
首先搞懂这个问题是什么意思。
由于设置了缓存失效时间(比如1小时),那么在这一小时内,如果有人更新了DB的数据,只要缓存不失效,Redis就不会主动读取DB并更新数据,那么用户看到的其实都是旧的数据,与DB不一致,此谓缓存脏读。
我的解决方案
我当时的回答是:找到更新数据的入口,每次更新DB都同步或异步更新缓存。比如
public void update(){
1.更新数据库
2.更新缓存(同步或异步)
}
面试官紧接着问我,如果A线程刚更新完缓存,B线程又来更新数据库,且尚未更新缓存,此时C线程从缓存中读到的就是旧的数据了。
我当时也是年轻啊,直接说:加锁