先更新数据库,再删除redis
- 没有试探机制,如果redis删除失败,永久不一致
- 并发问题:删除redis之前,其他线程读取到旧数据
先删除缓存,再更新数据库
- 没有试探机制,如果数据库更新失败,永久不一致
- 并发问题:更新数据库之前,其他线程读到db旧数据又写回redis旧数据
延时双删(先更新数据库,再删除redis的优化版本)
- 引入试探机制,先删除redis,删除成功表示redis链接可用有效
- 更新数据库成功说明数据库连接有效
- 延迟删除redis
- 能保证最终一致性
先更新数据,再更新redis(不推荐)
- 并发情况下会错乱顺序
- A先更新db,b后更新db。但是b先更新redis,a后更新redis。最后db是b的,redis却是a的数据
使用分布式锁
- 加分布式锁不需要考虑并发问题了,只考虑事务问题
- 先更新db,再删除redis
- redis失败,则db回滚