mysql引入redis后,暂不考虑主从复制和读写分离,我们的策略是:
一、读的时候更新缓存呢(推荐)
分析如下:我们在操作数据库写的时候,删除缓存,更新数据库,然后在读的时候,更新缓存(这个操作如果不是强一致性的情况下,我们这4步操作都不需要加锁,可以通过设置key的过期时间来解决数据的最终一致性)
二、写的时候更新缓存呢(不推荐)
分析如下:我们在操作数据库写的时候,去更新缓存,更新数据库,读的时候直接读缓存即可(这样在高并发的场景下,需要保证这二步操作的原子性,影响性能,不推荐)
在读的时候更新缓存又存在二个方面问题(暂不考虑主从复制和读写分离):
(1)写操作时,是先删除缓存,在更新数据库呢
问题一、如果在高并发的场景下,会出现数据库与缓存数据不一致
- 线程 A 删除了缓存 线程 B 查询,发现缓存已不存在
- 线程 B 去数据库查询得到旧值
- 线程 B 将旧值写入缓存
- 线程 A 将新值写入数据库
如何解决?设置缓存的过期时间,这样可以达到最终一致性
问题二、如果删除缓存失败或更新数据库失败了会怎样?
- 第一步删除缓存成功,第二步更新数据库失败,