1、写操作时:先更新数据库,再清除缓存;
2、读操作:读取缓存,存在则直接返回,不存在则读取数据库,之后更新到缓存。
为什么是删除缓存,而不是更新缓存呢?
更新缓存会有并发问题,可能会导致缓存与数据库数据不一致,这对大多数业务场景来说是不能接受的。如线程1和2都是写操作,线程1先完成数据库写操作,然后线程2完成了数据库和缓存的写操作,之后线程1完成缓存写操作,那么此时缓存和数据库的数据就不一致了。
为什么不是先删除缓存,再更新数据库呢?
先删除缓存、再更新数据库容易造成读写请求并发问题,可能造成数据不一致。另外,先删除缓存,由于缓存中数据缺失,加剧数据库的请求压力,可能会增大缓存穿透出现的概率。
那当前这个方案在并发读写的时候会有数据不一致的问题吗?
当前方案出现数据不一致问题的概率很小,出现的条件极其严苛。如果需要强一致性,也是需要加分布式锁的,但是这样的话,方案的复杂性就会大大增加了。