如何保障缓存和数据库数据的一致性
更新机制
2 种更新机制的阐明
1. 触发更新
用户发动申请,缓存生效,从数据库中读取数据,更新缓存
2. 被动更新
管理员在后盾批改数据,删除缓存或者更新缓存
个别状况 2 种更新机制同时应用
缓存和数据库数据的一致性策略
1. 双写 – 先更新数据库,再更新缓存
被动 + 触发
管理员后盾批改数据,同时用户发动申请,脏数据的可能性
工夫 | T1 | T2 | T3 | T4 | T5 |
---|---|---|---|---|---|
被动更新 | 更新数据库 | 更新缓存 | |||
触发更新 | 读缓存,生效 | 读数据库 | 更新缓存 |
双被动
2 个管理员后盾同时批改数据,小概率
工夫 | T1 | T2 | T3 | T4 |
---|---|---|---|---|
被动更新 A | 更新数据库 | 更新缓存 | ||
被动更新 B | 更新数据库 | 更新缓存 |
双触发
双触发更新,最多导致 2 次更新缓存,个别加锁只更新 1 次
总结
双写会有 2 个问题
- 脏数据的小概率事件
- 性能节约
有认为你应用了缓存,必然是热数据,申请会很多,你不被动更新缓存,也会有用户触发更新缓存,并不存在性能上的节约。但不意味着每时每刻、所有数据都会被频繁申请,因而双写必然会导致局部性能的节约
2. 先删除缓存,再更新数据库
会导致 被动 + 触发
,写入脏数据概率减少
3. 先更新数据库,再删除缓存
被动 + 触发
,仍然有概率写入脏数据
4. 先更新数据库,再提早删除缓存
提早计划
- 代码间接提早,取决更新工夫
删除操作
退出队列,提早解决删除操作
- 先
删除操作
,退出队列,再提早
队列问题
- 队列数据失落的问题
- 解决队列操作时间差,缓存数据不统一