栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Redis缓存穿透和缓存击穿

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Redis缓存穿透和缓存击穿

一、缓存穿透

1、redis缓存穿透概念

用户查询某一个数据,但该数据不存在于redis内存数据库中(缓存没有命中),这时候就会向持久层数据库查询,但持久层数据库也没有该数据,于是本次查询失败,若用户很多时,他们查询的数据不存在于redis内存数据库中(缓存没有命中),于是都去请求了持久层数据库,这样就会给持久层数据库带来很大的压力,这种大量不走redis内存数据库的现象就叫缓存穿透。

2、解决方案

(1)布隆过滤器

在控制层对请求先进行校验,不符合条件的请求则被丢弃,从而避免对持久层数据库造成的查询压力。

(2)缓存空对象

当查询的数据不存在于redis中时,请求到了持久层数据库中去查询数据,但查询不出数据,这时会返回空对象,同时把该空对象缓存到redis里,然后设置一个过期时间,往后只要再次请求查询该条数据,该条数据都会从redis中获取(获取redis返回的空对象),从而保护了后端的数据源。

缺点:

【1】因为空对象能被缓存起来,而有些请求有可能查询不出数据,所以过程中可能产生大量的返回空对象然后被redis缓存的现象,而这意味着redis需要更多的空间来存储更多的键。

【2】即使对空对象设置了过期时间,但如果在redis的空对象在未过时的情况下,持久层数据库已经有了对应的数据,而redis对应的键的值仍是空对象,这时请求查询出的仍是空对象,而不是持久层里已经有的数据,而这种情况对于需要保持数据一致性的业务会造成影响。

二、缓存击穿

1、redis缓存击穿概念

redis里的一个key非常热点,导致大并发集中对这个key不断的进行访问,当在这个key过期的瞬间,持续的大并发就会跳过缓存,直接作用在持久层数据库上,请求在访问持久层数据库查询数据的同时,持久层数据库也需要回写缓存,这时候就会导致持久层数据库瞬间压力过大导致服务器宕机,这种现象就叫做缓存击穿。

2、解决方案

(1)设置热点key永不过期。

(2)加互斥锁:使用分布式锁在redis和持久层数据库之间加锁,让每次查询都能保证只有一个线程进去,其他线程等待,这样做就能保证对于每一个key同时只能有一个线程去查询后端持久层数据库,而其他线程没有分布式锁的权限,所以只能等待,这种解决方案把高并发的压力转移到了分布式锁身上,但同时也加大了对分布式锁的考验。

三、缓存雪崩

1、redis缓存雪崩概念

在某一时间段,一批key集中过期失效或者redis宕机,导致大量的请求作用在持久层数据库上,导致持久层数据库挂掉。

其他:

注意三者的区别,缓存渗透是个别key没有被命中,导致请求作用在持久层数据库上,这时影响较小(为方便记忆,可以根据词义进行助记,渗透一词的意味较广泛、分散、轻缓,可记成缓存渗透就是请求穿透redis发生得不集中,较广泛分散,穿透的请求在全部请求里就像分散的一个个的点);缓存渗透是大量的请求作用在同一个key上,在key过期的瞬间作用在持久层服务器上,导致服务器宕机,这时影响较大(为方便记忆,可以根据词义进行助记,穿透一词的意味范围集中,不分散,可记成缓存击穿就是请求作用集中在一点上,穿透redis直接作用在持久层数据库上,请求就像一条穿透redis和持久层数据库的线);缓存雪崩是一批key集中过期或redis宕机,导致持久层数据库挂掉,影响很大(为方便记忆,可以根据词义进行助记,雪崩一词的意味作用很广泛、范围很大,可记成缓存雪崩就是请求大量、大片的穿透redis作用在持久层数据库上,一片请求穿透redis,形象点就是面)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1028637.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号