一般我们的热点数据用到缓存,都存在一个问题。
就是在数据更新时,到底是
1,先更新 db 再更新缓存
2,先更新缓存再更新 db
3,更新 db 前让缓存无效
4,更新 db 后让缓存无效
1,先更新 db 再更新缓存的情况
存在一个问题,当对一条数据进行更新时,无法保证前面的线程先执行完
然后下一个线程再执行的情况
可能存在这样一种情况:线程 1 先更新了 db 但还没更新缓存,然后线程 2 更新了 db 又更新了缓存,然后线程 1 更新了缓存
这种情况还是比较常发生的,因为两个线程同时执行一个方法,时间上的先后难以保证,运行完此方法的先后。因此不推荐。
2,先更新缓存再更新 db
这种存在一个问题,假设线程 1 更新了缓存,但还没更新 db,然后线程 2 更新了缓存又更新了 db,然后线程 1 再更新 db
展开剩余47%这样就导致了线程不安全的问题,跟 1 类似,因此不推荐。
3,更新 db 前让缓存无效
假设线程 1 先让缓存失效,还没更新 db,此时有大量的线程 2,3,4,5 去查缓存,没有查到就会直接查数据库,造成缓存穿透问题
因此不推荐。
4,更新 db 后让缓存无效
线程 1 更新 db 后,将缓存无效了,然后再查了一次缓存,线程 2 更新 db 后,将缓存无效了,
此时线程 1 还是旧的数据,这种情况的发生是线程 2 的写 db 速度比线程 1 的读还快,一般这种情况概率比较低
所以推荐这种做法。
发布于:湖南省
煤炭灰的“光影魔术”:自然层次的艺术 深入解析煤炭灰在不同光线下的渐变魅力,从亮...
如果说世界上有哪一场晚宴能让名媛们一夜之间化身“迪士尼在逃公主”,那大概率就是巴...
虾青素的抗衰效用经多项权威研究验证,既能清除自由基、抵御氧化应激造成的细胞损伤,...
4月5日讯 浙江队即将在本轮中超对阵北京国安,赛前浙江球员赵博和主帅卡内达出席新...