普通情况和高并发时,Redis缓存和数据库怎么保持一致?
- 普通情况
- 思路
- 高并发时
- 思路
Q:缓存和数据库怎么保持一致?
A:绝对不可能保持一致的,在实际业务开发中,有一些方案可以做取舍。
实际业务中,疑问点主要有:
- 是先更新Redis还是先更新Mysql?
- 是Redis和Mysql都更新,还是只更新Mysql?
- Mysql或Redis其中一个更新失败,该业务要算作失败吗?需要回滚吗?
这是我根据实际业务开发经验,总结的操作方案图:
普通情况
思路
仅保证数据库是完整有效的数据,有变动后就删除Redis,不一致的结果都属于延迟的情况。但是当数据变动后,都需要访问数据库至少一次来更新到缓存。
新增
- Mysql新增数据,失败即失败
- Redis无操作
编辑
- Mysql修改数据,失败即失败
- Redis删除数据,失败即失败
删除
- Mysql删除数据,失败即失败
- Redis删除数据,失败即失败
获取
- 从Redis获取,就有返回
- 从Mysql获取,有就更新到Redis,返回
高并发时
思路
需要保证数据库和Mysql是完整有效的数据,有变动时需要同步修改Redis,不一致的结果都属于延迟的情况。当数据变动后,无需访问数据库。
新增
- Mysql新增数据,失败即失败
- Redis新增数据,失败即失败
编辑
- Mysql修改数据,失败即失败
- Redis修改数据,失败即失败
删除
- Mysql删除数据,失败即失败
- Redis删除数据,失败即失败
获取
- 从Redis获取,有就返回,无就返回无