redis缓存更新策略
场景:数据库表中存放了用户信息,包括用户名、手机号,用户信息在redis中也缓存了一份;用户修改手机号,需要更新redis缓存………
1.先操作缓存, 再更新数据库
/*
操作步骤
*1.让缓存失效(delete,根据情况,查询缓存时需配合缓存击穿解决方案),
*或者更新缓存(update)
*2.更新数据库
*
问题分析
*1)当操作1失败,操作2也失败时。数据不变,一致性不受影响
*2)当操作1失败,操作2成功时,如果不加补偿策略,数据一致性受影响(可采用最 终一致性方案,异步的将数据库中的数据更新到缓存)
*3)当操作1成功,操作2失败时,如果操作1采用的是delete,那么需配合缓存击穿解决方案可以让数据回到原始状态,如果1操作采用的是update,那么数据一致性受影响
* 4)当操作1成功,操作2也成功时,如果操作1采用的是delete,那么并发时(操作2没有提交,就已经有线程来查询缓存,可能回设缓存的还是老数据),数据一致性受影响
*/
2.先更新数据库,再操作缓存
/*
操作步骤
*1.更新数据库
*2.让缓存失效(delete,根据情况查询缓存时需配合缓存击穿解决方案)
* 或者更新缓存(update)
*
* 问题分析
*1)当操作1失败时,不执行操作2,数据一致性不受影响
*2)当操作1成功,操作2失败时,如果不采用补偿措施,数据一致性受影响。
* 如果采用补偿措施(可采用最终一致性方案,异步的将数据库中的数据更新到缓存),数据会短暂的不一致,但最终会一致
*3)当操作1成功,操作2也成功时,数据一致,且是最新数据。(但在操作2成功,操作1还没有完成时,就已经有线程来查询缓存,此时也会读到老数据)
*/
总结:采用先更新数据库,再操作缓存的策略