个人公众号,欢迎关注下:小蜗牛会飞
简述三种缓存失败场景及解决方案简述三种缓存失败场景及解决方案https://mp.weixin.qq.com/s/pxtOcnZ04z_2UCSnVfaYNw
这次我们来聊聊Redis的一些知识点,这个知识点也是在面试当中经常被问到,所以特此记录下。在我们的开发中,为了性能方面的考虑,我们第一时间都会想到用缓存,而我们用的最多的就是Redis。如有错误,欢迎指出。闲话不说,干起来
一:Redis为什么快?
其中有几点原因:
1.数据存储在内存中,读取的时候不需要进行磁盘的 IO
2.单线程保证了系统没有线程的上下文切换,无锁竞争
3.多路I/O复用模型,非阻塞IO
4.数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的
下面我们来说说三种缓存失败场景以及它们的解决方案:
首先我们先来看看使用缓存的执行流程是怎样的,见下图:
二:请求命中缓存执行流程:
前台请求,先在Redis缓存中查询是否存在所需数据,若存在直接返回数据,若不存在,此时请求就会请求到我们的DB,如果DB存在所需数据,则返回给应用程序,应用程序更新数据到缓存中,之后返回给前台,如果DB不存在所需数据,则直接返回空数据给前台。
三:三种缓存失败场景
1.缓存穿透
场景:缓存穿透指当请求一个在缓存和数据库中都不存在数据,而用户一直在请求。此时可能就会遭到黑客的攻击,造成系统的奔溃等问题。
解决方案:从缓存中找不到并且从数据库中找不到的数据时,我们可以在缓存中设置key-null,这种值,value为空,但是这种数据的缓存时间不能过长,否则如果有数据则会出现拿不到的情况,一般设置20s,30s等比较短的过期时间,这样子可以防止有人刻意请求,导致DB的奔溃。
2.缓存击穿
场景:缓存击穿是针对缓存没有对应的数据,数据库有数据的场景。当大量请求需要获取相同key的值时(记住这里是请求相同key的一条数据),此时这个key的值刚好过期了或者被移除掉等,此时会有大量的请求线程直接请求DB中,会造成DB的压力瞬间增大,击溃DB。
解决方案:
a.如果是热点数据,可以设置永久不过期时间
b.通过加互斥锁,防止大量请求到DB,伪代码如下:
3.缓存雪崩
背景:缓存雪崩是指大量的缓存数据同一时间大批量过期(这里是大批量数据),此时就会出现大量请求到DB,造成DB压力大,击垮DB
解决方案:
a.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
b.如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
c.设置热点数据永远不过期