缓存穿透 & 缓存击穿 & 缓存雪崩

缓存穿透

请求的数据不在缓存中,直接穿过缓存访问数据库,但是数据库也没有该数据

  • 描述

key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

  • 解决方案

有很多种方法可以有效地解决缓存穿透问题最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

缓存击穿

并发量过大,缓存没有但数据库有,直接访问数据库导致压力过大

  • 描述

key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

  • 解决方案
  1. 设置热点数据永远不过期。
  2. 加互斥锁

缓存雪崩

缓存中大批量的数据全部瞬间过期,导致数据库瞬间压力过大。

与缓存击穿的区别在于这里针对很多key缓存,前者则是某一个key

  • 描述

当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。

  • 解决方案
  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  2. 如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
  3. 设置热点数据永远不过期。
posted @ 2020-07-26 17:31  微信搜索-程序媛小庄  阅读(119)  评论(0编辑  收藏  举报