一般我们的热点数据用到缓存,都存在一个问题。
就是在数据更新时,到底是
1,先更新db再更新缓存
2,先更新缓存再更新db
3,更新db前让缓存无效
4,更新db后让缓存无效
1,先更新db再更新缓存的情况
存在一个问题,当对一条数据进行更新时,无法保证前面的线程先执行完
然后下一个线程再执行的情况
可能存在这样一种情况:线程1先更新了db但还没更新缓存,然后线程2更新了db又更新了缓存,然后线程1更新了缓存
这种情况还是比较常发生的,因为两个线程同时执行一个方法,时间上的先后难以保证,运行完此方法的先后。因此不推荐。
2,先更新缓存再更新db
这种存在一个问题,假设线程1更新了缓存,但还没更新db,然后线程2更新了缓存又更新了db,然后线程1再更新db
这样就导致了线程不安全的问题,跟1类似,因此不推荐。
3,更新db前让缓存无效
假设线程1先让缓存失效,还没更新db,此时有大量的线程2,3,4,5去查缓存,没有查到就会直接查数据库,造成缓存穿透问题
因此不推荐。
4,更新db后让缓存无效
线程1更新db后,将缓存无效了,然后再查了一次缓存,线程2更新db后,将缓存无效了,
此时线程1还是旧的数据,这种情况的发生是线程2的写db速度比线程1的读还快,一般这种情况概率比较低
所以推荐这种做法。
来源:oschina
链接:https://my.oschina.net/u/3574106/blog/3213314