更新策略 | 存在问题 |
先更新数据库,再更新缓存 | 1、更新缓存的时候失败了(或者更新的时候晚了被其他线程读取到的还是旧值),导致缓存中存的一直都是脏数据; 2、多个线程在更新时,因为两个更新步骤执行顺序不一致,可能会导致数据错乱 |
先更新缓存,再更新数据库 | 1、不太推荐,业务上一般把mysql最后保障 2、多线程环境下,A、B两个线程有快有慢,最后可能导致缓存与数据库不一致; |
先删除缓存,再更新数据库 | 1、多线程下,A还没更新完数据库;B进来查缓存没查到,就会读取数据库的旧值写入缓存(延迟双删:可以等一会再删除一遍缓存) 2、删了缓存假如这个时候流量激增查询这个key,会导致缓存击穿数据库 |
先更新数据库,再删除缓存(推荐) | 假如删除失败或者来不及,就会被其他线程读取到旧值(存在一定时间数据不一致但是会保证最终一致性) |
1、先更新数据库,再更新缓存
2、先更新缓存,再更新数据库
3、先删除缓存,再更新数据库
4、先更新数据库,再删除缓存(推荐)
参考canal原理:
总结:
参考:尚硅谷Redis7课程笔记