常见的缓存策略

一. 为什么要使用缓存?

如果说要对一个站点或者应用程序进行优化,那么我们最先想到的优化方式应该是使用缓存,使用缓存是最快也是效果最明显的方式。
优点:
1.减轻数据库压力(核心)
2.提高用户体验
3.增强系统的并发能力
缺点:
1.数据不一致(延迟更新)
2.使用不当容易引发其他问题

二. 什么样的数据适合缓存?

1.数据量不是很大
2.访问频率高
3.数据不经常更新

三. 常见的缓存策略有哪些?

1.Cache-Aside

一种比较简单实用的方式,可能是最常用的策略。
在这里插入图片描述
1.首先,应用程序先确定数据是否保留在缓存中;
2.如果数据在缓存中,也即 Cache hit (缓存命中)。数据直接从缓存中读取并返回给客户端应用程序;
3.如果数据不在缓存中,也即 Cache miss(缓存未命中)。应用程序会从数据库中读取该数据,并将数据存储在缓存中,然后将其返回给客户端。
4.如果需要要更新某个数据,也是先去更新数据库中的数据,更新完成之后,则通过指令让缓存Cache中的数据失效。
该策略特别适合“读多”的应用场景。可以在一定程度上抵抗缓存故障。如果缓存服务发生故障,系统仍然可以通过直接访问数据库进行操作。
这种策略并不能保证数据存储和缓存之间的一致性,也会有可能产生脏数据,但是概率很小,属于极端情况。(假如同时有2个请求A和请求B并发执行。A是首次访问缓存中没有数据,就会去数据库中读数据,读到了数据准备写入缓存中,在A把数据写入缓存之前,B更新了数据库,并且设置了缓存失效。然后A才开始把数据写回缓存中,那么最终就会导致,缓存中的数据与数据库的数据不一致,造成了脏数据)通常都是要给缓存加上一个过期的时间,如果必须考虑删除缓存失败的问题,可以使用消息队列实现重试机制(从消息队列取出这些key再次进行删除,失败再次加入到消息队列中,超过一定次数以上则人工介入)–越搞越复杂。
因为首次请求数据需要先把数据加载到缓存中,开发人员可以通过手动触发查询操作来对数据进行“预热”。

2.Read/Write-Through

这个模式其实就是由缓存服务完成数据同步的工作。
1.应用要读数据和更新数据都直接访问缓存服务
2.缓存服务同步的将数据更新到数据库
这个模式出现脏数据的概率就比较低,但是就强依赖缓存了,对缓存服务的稳定性有较大要求,另外,增加新缓存节点时还会有初始状态空数据问题。

3.Write-Behind

这个模式就是 Read/Write Through 模式 的一个变种。区别就是 Read/Write Through 模式的缓存写数据库的时候是同步的,而 Write Behind 模式 的缓存操作数据库是异步的。
1.应用要读数据和更新数据都直接访问缓存服务
2.缓存服务异步的将数据更新到数据库(通过异步任务)
这个模式的特点就是速度很快,效率会非常高,但是数据的一致性比较差,还可能会有数据的丢失情况,实现逻辑也较为复杂。

以上就是目前三种主流的缓存更新策略,另外还有Refrsh-Ahead模式等由于使用的不是很常见就不详细介绍了。

参考链接:https://www.jianshu.com/p/22c7e9ab5d15

四. 缓存的主要问题和解决办法有哪些?

1.缓存穿透

描述:
缓存穿透是指用户请求的数据在缓存和数据库中都不存在。例如恶意攻击者发起id为“-1”的数据或id为特别大不存在的数据,如果不加以校验,请求会透过缓存直接去访问数据库,导致数据库压力过大。

解决办法:
1.id做基础校验
2.缓存和数据库都查不到数据时,缓存内容为null或者其他默认值,并设置较短的过期时间(根据项目情况合理设置,时间不宜过长)。
3.限流

扫描二维码关注公众号,回复: 11154335 查看本文章

2.缓存击穿

描述:
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力

解决办法:
1.缓存预热。
2.使用互斥锁(mutex key)
3.让热点数据“永不过期”(配合其他策略在项目容错允许的范围内保证数据一致,也可通过一个后台的异步线程进行缓存的构建)
4.限流+降级

3.缓存雪崩

描述:
缓存雪崩是指缓存中的大批量key同一时段过期,而该时段内查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发同一个key。

解决办法:
1.缓存预热。
2.将缓存失效时间分散开(随机时长+基础时长)。
3.让热点数据“永不过期”(配合其他策略在项目容错允许的范围内保证数据一致,也可通过一个后台的异步线程进行缓存的构建)
4.限流+降级

参考文档地址:
链接: https://blog.csdn.net/kongtiao5/article/details/82771694.

原创文章 7 获赞 0 访问量 385

猜你喜欢

转载自blog.csdn.net/qq_33101689/article/details/105245986