数据库与缓存服务器的一致性问题
修改数据时, 数据库和缓存服务器一致性问题
几种修改策略, 以及存在的问题, 都有可能造成缓存与数据库不一致
- 修改数据库, 修改缓存
线程A - 修改学生1
-> 修改数据库
线程A被打断, 执行B
-> 修改缓存线程B - 修改学生1
-> 修改数据库
-> 修改缓存
执行线程A
- 修改缓存, 修改数据库
线程A - 修改学生1
-> 修改缓存
被打断, 执行线程B
-> 修改数据库线程B -> 修改学生1
-> 修改缓存
-> 修改数据库
- 删除缓存, 修改数据库
线程A - 修改学生1
-> 删除缓存
被打断, 执行线程B
-> 修改数据库线程B - 查询学生
-> 查询缓存
-> 查询数据库
-> 重建缓存
- 修改数据库, 删除缓存
线程A - 修改学生1
-> 修改数据库
被打断, 执行线程B
-> 删除缓存
执行线程B线程B - 查询学生1
-> 查询缓存, 缓存刚好失效
-> 查数据库
被打断, 执行线程A
-> 重建缓存
ps:
实际开发一定选第四种策略, 这种策略是出问题概率最低的
有时也可以采用 延时双删: 修改数据 -> 删除缓存 -> 延迟2s -> 删除缓存(也有问题)
如果要保证完全没问题, 就要牺牲效率, 使用分布式锁了, 这样划不来.