缓存雪崩
缓存雪崩可能是因为数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。
解决思路:
1,采用加锁计数,或者使用合理的队列数量来避免缓存失效时对数据库造成太大的压力。这种办法虽然能缓解数据库的压力,但是同时又降低了系统的吞吐量。
2,分析用户行为,尽量让失效时间点均匀分布。避免缓存雪崩的出现。
3,如果是因为某台缓存服务器宕机,可以考虑做主备,比如:redis主备,但是双缓存涉及到更新事务的问题,update可能读到脏数据,需要好好解决。
缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询。
解决思路:
1,如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。
2,根据缓存数据Key的规则。例如我们公司是做机顶盒的,缓存数据以Mac为Key,Mac是有规则,如果不符合规则就过滤掉,这样可以过滤一部分查询。在做缓存规划的时候,Key有一定规则的话,可以采取这种办法。这种办法只能缓解一部分的压力,过滤和系统无关的查询,但是无法根治。
3,采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的BitSet中,不存在的数据将会被拦截掉,从而避免了对底层存储系统的查询压力。关于布隆过滤器,详情查看:基于BitSet的布隆过滤器(Bloom Filter)
大并发的缓存穿透会导致缓存雪崩。
缓存预热
单机web系统情况下比较简单。
解决思路:
1,直接写个缓存刷新页面,上线时手工操作下。
2,数据量不大,可以在WEB系统启动的时候加载。
3,搞个定时器定时刷新缓存,或者由用户触发都行。
分布式缓存系统,如Memcached,Redis,比如缓存系统比较大,由十几台甚至几十台机器组成,这样预热会复杂一些。
解决思路:
1,写个程序去跑。
2,单个缓存预热框架。
缓存预热的目标就是在系统上线前,将数据加载到缓存中。
缓存算法
FIFO算法:First in First out,先进先出。原则:一个数据最先进入缓存中,则应该最早淘汰掉。也就是说,当缓存满的时候,应当把最先进入缓存的数据给淘汰掉。
LFU算法:Least Frequently Used,最不经常使用算法。
LRU算法:Least Recently Used,近期最少使用算法。请查看:Memcached之你真正理解LRU吗(4)
LRU和LFU的区别。LFU算法是根据在一段时间里数据项被使用的次数选择出最少使用的数据项,即根据使用次数的差异来决定。而LRU是根据使用时间的差异来决定的
有兴趣的朋友可以加入我的互联网架构群:477819525
内有大量java初级,进阶,高级,架构视频和书籍资料,大家一起交流学习。
相关推荐
Redis扩展:缓存雪崩和缓存穿透问题解决方案.docx
Redis中缓存雪崩、缓存穿透等问题的解决方案.docx
缓存雪崩,缓存穿透,缓存击穿出现的原因及解决方案.docx
Redis系统学习之缓存穿透,缓存击穿,缓存雪崩的概念及其解决方案.docx
如何设计缓存系统:缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx
提供了解redis实践开过程中,所面对缓存雪崩 缓存穿透 缓存并发的处理方案,同时这些个问题也是面试的经典问题,有助提升开发者的知识视野
缓存击穿:某一个热点数据,缓存中某一时刻失效了,因而大量并发请求打...缓存雪崩:指的是大面积的 key 同时过期,导致大量并发打到我们的数据库。不像击穿,只是因为 1 个 key 的过期。 缓存穿透:数据库里“没”数据。
缓存穿透,缓存击穿和缓存雪崩的区别以及解决方案.docx
缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx
面试必备:缓存穿透,缓存雪崩的四种解决方案.docx
Redis缓存穿透缓存雪崩缓存击穿的原因和解决方案.docx
常见的缓存穿透,缓存击穿,缓存雪崩解决方案分析.docx
redis缓存雪崩,redis缓存穿透,redis缓存击穿 redis应对高并发造成的雪崩、穿透、击穿
缓存穿透、缓存击穿、缓存雪崩区别和解决方案【php】.docx
Redis使用-缓存穿透,雪崩,击穿以及解决方案分析.docx
二、缓存穿透,缓存击穿和缓存雪崩 缓存穿透 描述:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1024”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致...
2.从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也
缓存穿透,击穿,雪崩以及解决方案,干货满满.docx
基于Redis解决缓存击穿、穿透和雪崩问题的通用解决方案,拿来即用。支持存储对象、集合、简单数据类型等。无需提前将数据存入Redis,直接使用提供的分布式缓存接口查询数据即可,附带完善的单元测试用例,方便学习...
也就是缓存穿透、缓存击穿、缓存雪崩的知识以及其相对应的解决方案! 本章共讲解了缓存的三种异常情况,上述的三种错误,都是因为原本就应该访问缓存中数据的,但却在缓存中不存在,亦或者是服务出现故障,导致程序...