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

Redis缓存异常场景分类(缓存穿透、缓存击穿、缓存雪崩)

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

Redis缓存异常场景分类(缓存穿透、缓存击穿、缓存雪崩)

Redis基础与使用SpringBoot整合Redis
Redis进阶学习之数据持久化
Redis进阶学习之主从复制、读写分离
Redis进阶学习之哨兵模式和分片集群
Redis主从复制集群搭建
Redis哨兵集群搭建
Redis分片集群搭建
Redis使用RedisTemplate配置和访问集群
Redis缓存异常场景分类

Redis缓存异常场景分类(缓存穿透、缓存击穿、缓存雪崩)

一般的请求过程

1.缓存穿透

缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍,然后返回空。
如果有恶意攻击者不断请求系统中不存在的数据,会导致短时间大量请求落在数据库上,造成数据库压力过大,甚至击垮数据库系统。

1.1. 解决方案

(1)布隆过滤器
布隆过滤器实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。
(2)返回空
当缓存未命中,查询数据库也为空,可以将返回的空对象写到缓存中,这样下次请求该key时直接从缓存中查询返回空对象,请求不会落到数据库。为了避免存储过多空对象,通常会给空对象设置一个过期时间。
这种方法会存在两个问题:

  • 如果有大量的key穿透,缓存空对象会占用内存空间。
  • 在key过期时间之前,在这段时间可能会存在缓存和数据库数据不一致的场景。
2.缓存击穿

缓存击穿,是指一个热点key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,数据库瞬时压力骤增,造成大量请求阻塞。

热点key:用户访问量高,高并发集中对这一个点进行访问。

2.1. 解决方案

(1)使用互斥锁
让第一个访问的一个线程回写缓存,其他线程等待回写缓存线程执行完,重新读取缓存即可。
(2)设置热点数据永不过期

3.缓存雪崩

缓存雪崩是指缓存中大批量的热点key到过期时间,而查询数据量巨大,请求直接落到数据库上,引起数据库压力过大甚至宕机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

3.1. 解决方案

(1)均匀过期
设置不同的过期时间,让缓存失效的时间点均匀分布。通常可以为有效期增加随机值或者统一规划有效期。
(2)加互斥锁
跟缓存击穿解决思路一致,同一时间只让一个线程构建缓存,其他线程阻塞排队。
(3)缓存永不过期
跟缓存击穿解决思路一致,缓存在物理上永远不过期,用一个异步的线程更新缓存。
(4)双层缓存策略
使用主备两层缓存:
主缓存:有效期按照经验值设置,设置为主读取的缓存,主缓存失效后从数据库加载最新值。
备份缓存:有效期长,获取锁失败时读取的缓存,主缓存更新时需要同步更新备份缓存。

4. 缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统,这样就可以避免在用户第一次发起大量请求的时候,先查询数据库,然后再将数据回写到缓存。
如果不进行预热, 那么 Redis 初始状态数据为空,系统上线初期,对于高并发的流量,都会访问到数据库中, 对数据库造成流量的压力。

5. 缓存降级

缓存降级是指缓存失效或缓存服务器挂掉的情况下,不去访问数据库,直接返回默认数据或访问服务的内存数据。
在实战中通常会将部分热点数据缓存到服务的内存中,这样一旦缓存出现异常,可以直接使用服务的内存数据,从而避免数据库遭受巨大压力。降级一般是有损的操作,所以尽量减少降级对于业务的影响程度。

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

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

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