博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存穿透、缓存击穿、缓存雪崩的解释及处理方式
阅读量:3701 次
发布时间:2019-05-21

本文共 1029 字,大约阅读时间需要 3 分钟。

缓存穿透

概念解释:

缓存穿透指的是缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了应有的作用。

在这里插入图片描述

解决方法

  • 缓存空值:
    在缓存中之所以发生穿透,是因为缓存没有对那些不存在的值的key缓存下来,从而导致每次查询都要请求到数据库。
    那么我们可以为这些key对应的值设置为null并放到缓存中,这样再出现查询这个key的请求的时候,直接返回null即可。但是需要有一个失效时间,因为如果不设置失效时间的话,当数据库有数据了,缓存服务器还是返回null的话就不一致了。
  • 布隆过滤器
    很多时候,缓存穿透是因为有很多恶意流量的请求,这些请求可能随机生成很多的key来请求查询,这些肯定在缓存和数据库中没有,就很容易导致缓存穿透。针对这种情况,可以使用一个过滤器。在缓存穿透的防治上常用的技术是布隆过滤器,布隆过滤器是一种比较巧妙的概率性数据结构,它可以告诉你数据一定不存在和可能存在,相比Map、Set、List等传统数据结构它占用内存少、结构更高效。
    对于缓存穿透,我们可以将查询的数据条件都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力。

缓存击穿

概念解释:

缓存击穿指的是当某一个key的缓存过期时大并发量的请求同时访问此key,瞬间击穿缓存服务器直接访问数据库,让数据库处于负载的情况。这种情况在系统中比较常见,比如秒杀、大促之类的。

在这里插入图片描述

解决方法

  • 异步定时更新
    比如在某一个热点数据的过期时间是1个小时,那么每59分钟,通过定时任务去更新这个热点key,并重新设置其过期时间。
  • 互斥锁
    在缓存的处理上,通常使用一个互斥锁来解决缓存击穿的问题。简单来说就是当Redis中根据key获得的value为空时,先锁上,然后从数据库中去加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,就先阻塞。

缓存雪崩

概念解释

  • 缓存雪崩是指大量缓存同时过期或者缓存服务宕机,所有请求都直接访问数据库,造成数据库的高负载,影响性能,甚至数据库的宕机。
    在这里插入图片描述

解决方法

  • 不同的过期时间:
    为了避免大量的缓存在同一个时间过期,可以把不同的key过期的时间设置成不同的,并且通过定时刷新的方式更新过期时间。
  • 集群:
    在缓存雪崩问题的防治上面,一个比较典型的技术就是采用集群方式部署,使用集群可以避免服务的单点故障。

转载地址:http://mylcn.baihongyu.com/

你可能感兴趣的文章
坚果pro2刷MIUI10
查看>>
坚果pro2救砖(文末包含900E的解决方法)
查看>>
setTimeout和setInterval执行时间问题
查看>>
mouse冒泡事件
查看>>
forEach、some和every关于提前退出
查看>>
改变input (radio,check)的样式
查看>>
vue单选、多选切换,v-model字符串、数组切换
查看>>
滑动鼠标,固定导航栏一直闪烁
查看>>
奇怪!为什么@media起作用,而@media screen and不起作用
查看>>
顶部固定导航栏随着横向滚动条的滚动一起运动
查看>>
jquery获得滚动距离的方法
查看>>
js获取当前点击的元素
查看>>
为什么js代码放在head中报错,放在body中却能正常调用
查看>>
jquery中text()、html()、val()的区别
查看>>
swiper导致图片文字变模糊
查看>>
当图片被压缩时,图片变得模糊
查看>>
js外部访问局部变量
查看>>
两栏布局的几种方式
查看>>
css实现旋转、放大
查看>>
jQuery常用方法总结
查看>>