莱莱 发表于 2022-12-14 21:17:36

redis缓存更新策略【项目总结】

Redis项目总结--缓存更新策略


目录

[*]Redis项目总结--缓存更新策略

[*]1.更新策略
[*]2.主动更新的三种方案(一般用方案一)
[*]3.主动更新方案一操作缓存和数据库的三个问题

[*](1)删缓存还是更新缓存(一般选删除缓存)
[*](2)如何保证缓存和数据库操作同时成功或失败
[*](3)先操作缓存还是先操作数据库(会引发两种不同的线程安全问题)

[*]4.缓存和数据库操作顺序引发的线程安全问题

[*](1)先删缓存再操作数据库
[*](2)先操作数据库再删缓存

[*]5.最终方案


1.更新策略

内存淘汰超时剔除主动更新说明不用自己维护,利用Redis内存淘汰机制,内存不足时自动淘汰部分数据,下次查询时更新缓存给缓存数据添加过期时间,到期删除,下次查询时更新缓存编写业务逻辑,在修改数据库的同时更新缓存一致性差一般(取决于过期时间的长短)好维护成本无低高低一致性场景选内存淘汰,高一致性场景选主动更新,也可以和超时剔除结合使用
2.主动更新的三种方案(一般用方案一)

方案一:在更新数据库 的同时更新缓存。
方案二:缓存与数据库整合为一个服务,由服务来维护一致性,调用者调用该服务,无需关心缓存一致性问题。

[*]优点:保证了数据的一致性
[*]缺点:开发成本高
方案三:调用者只操作缓存,由其他线程异步将缓存数据持久化到数据库。

[*]优点:异步更新缓存数据,效率高。两次异步更新之间,对一个数据进行了多次修改,最终只有最后一次的更新有效,相当于将多次更新合并为一次。
[*]缺点:维护成本高,一致性和可靠性存在问题。数据变动后到下一次异步更新前数据不一致。若出现宕机则数据丢失。
3.主动更新方案一操作缓存和数据库的三个问题

(1)删缓存还是更新缓存(一般选删除缓存)


[*]更新缓存:每次更新数据库都更新缓存,无效写操作多
[*]删除缓存:更新数据库时让缓存失效,查询时再更新缓存
(2)如何保证缓存和数据库操作同时成功或失败


[*]单体系统:将缓存与数据库操作放到同一个事务
[*]分布式系统:利用TCC等分布式事务事务方案
(3)先操作缓存还是先操作数据库(会引发两种不同的线程安全问题)


[*]先删缓存再操作数据库
[*]先操作数据库再删缓存
4.缓存和数据库操作顺序引发的线程安全问题

一般更新的操作比查询和写入缓慢,第二种操作发生异常的概率比第一种操作低,所以一般使用先操作数据库再删缓存
(1)先删缓存再操作数据库

正常情况:
https://images.cnblogs.com/cnblogs_com/blogs/730380/galleries/2098763/o_221208113216_%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-12-08%20192837.png
异常情况:
https://images.cnblogs.com/cnblogs_com/blogs/730380/galleries/2098763/o_221208113158_%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-12-08%20192750.png
(2)先操作数据库再删缓存

正常情况:
https://images.cnblogs.com/cnblogs_com/blogs/730380/galleries/2098763/o_221208113232_%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-12-08%20192909.png
异常情况:
https://images.cnblogs.com/cnblogs_com/blogs/730380/galleries/2098763/o_221208113243_%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202022-12-08%20192939.png
5.最终方案

综上,一般选用主动更新+超时剔除

[*]根据id查询店铺时,缓存未命中则查询数据库,将数据库结果写入缓存,并设置超时时间。
[*]根据id修改店铺时,先修改数据库再修改缓存。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: redis缓存更新策略【项目总结】