缓存穿透、击穿、雪崩区别和解决方案

转自公众号:自强学堂

文中的cache指缓存,比如redis,db指数据库,比如mysql。

一、缓存的三种模式

这里主要指的是应用代码对 cache 和 db 中数据的维护方式。

1.1 应用代码同时更新 cache 和 db

a)数据写入流程

b)数据读取流程

1.2 应用代码只更新 cache,cache 负责同步更新 db

此时可以将 cache 和 db 看成一个整体,db 自己维护 cache。

1.3 应用方代码更新缓存,另外将 cache 中数据定期更新到 db

类似于 Linux 文件系统中的 page cache。

这个可能会导致数据不一致,甚至数据丢失。

二、缓存使用要注意的问题

当缓存使用不当时,可能会导致请求瞬间打到db,db 扛不住挂掉。

常见的有以下三种问题。

2.1 缓存穿透

概念说明:指 cache 和 db 中都没有数据,读完 cache 没有,再读 db 还是没有,每次请求到 cache 和 db。

解决方法:

a).拦截非法请求,比如不正常的 id 请求直接拒绝。

b).没有数据时也 cache 下,过期时间可设置短点,不把过多请求打到 db 去。

c).使用 Write Behind Caching 模式,命中不了 cache 不读取 db。这时需要注意 cache 大小,此时的数据都存在了内容。

d).采用布隆过滤器,不存在的 key 直接过滤;布隆过滤器判断存在,则数据可能存在,如果判断不存在,则肯定不存在。

一般建议前两种,实现起来比较简单

2.2 缓存击穿

概念说明:一般是少量热点数据过期(比如微博热搜),导致大量请求查 cache 没有,又查 db。

解决方法:

a)热点 key 永不过期,异步更新。

b)更新热点 key 时加锁,同一个 key 最好只有一个请求打到 db。

c)接口限流,熔断、降级

2.3 缓存雪崩

概念说明:大量 cache 数据同时过期,导致大量请求打到 db。

解决方法:

a).热点 key 永不过期,异步更新。

b).防止同时大量数据过期,cache 过期时间随机抖动下。

原文地址:https://www.cnblogs.com/wuyongqiang/p/12636803.html

时间: 2024-10-11 00:56:09

缓存穿透、击穿、雪崩区别和解决方案的相关文章

缓存穿透、缓存击穿、缓存雪崩区别和解决方案

一.缓存处理流程 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果. 二.缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据.这时的用户很可能是攻击者,攻击会导致数据库压力过大. 解决方案: 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截: 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-va

《缓存 - 穿透/击穿相关》

一:什么是缓存穿透? - 定义 - 正常情况下,我们在理想的条件下去查询缓存数据都是存在的. - 那么请求去查询一条数据库中不存在的数据,也就是缓存和数据库都查询不到这条数据. - 所以请求每次都会打到数据库上面去,这种查询不存在数据的现象我们称为缓存穿透. - 问题 - 在大量的恶意请求会直接打到数据库上,会造成数据库的压力过大.影响正常业务,同时可能造成数据库宕机. - 解决方案 - 缓存空值 - 发生穿透的大部分情况,都是因为缓存中没有存储这些空数据的key.从而导致每次查询数据库. -

Redis缓存穿透和雪崩

一.缓存雪崩 1. 缓存挂了,所有请求都到了数据库了 2. 缓存没有挂,但同时到期,正好把所有缓存都删除了,所有请求都到了数据库了 3. 所有请求都到了数据库,很可能把数据库搞挂 二.缓存雪崩的解决方法 1. 缓存挂了的情况 a. 事发前:实现redis的高可用性(主从+sentinal+cluster) b. 事发时:本地缓存+限流(hystrix) c. 事发后:Redis持久化,重启后从磁盘上加载数据,快速恢复 三.缓存穿透 1. 查询一个不存在的数据,由于没有从数据库里查到,就不放入缓存

缓存雪崩 Cache Avalanche 缓存穿透 Cache Penetration 缓存击穿 Hotspot Invalid

一.无处不在的缓存缓存在计算机系统是无处不在,在CPU层面有L1-L3的Cache,在Linux中有TLB加速虚拟地址和物理地址的转换,在应用层有Redis等内存数据库缓存.在浏览器有本地缓存.手机有本地文件缓存等等.可见,缓存在计算机系统中有非常重要的地位,主要作用就是提高响应速度.减少磁盘读取等,本文主要讨论在高并发系统中的缓存系统.一句话概括缓存系统在高并发系统中的地位的话,就是: 如果高并发系统是烤羊肉串,那么缓存系统就是那一撮孜然...... 二.高并发系统中的缓存 缓存系统的作用 缓

缓存穿透,缓存击穿,缓存雪崩解决方案分析

本文转自:http://blog.csdn.net/zeb_perfect/article/details/54135506 前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义.在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞

缓存穿透、缓存击穿、缓存雪崩及其解决方案

1.缓存穿透 缓存穿透是指查询一个一定不存在的数据,因为缓存中也无该数据的信息,则会直接去数据库层进行查询,从系统层面来看像是穿透了缓存层直接达到DB,从而称为缓存穿透,没有了缓存层的保护,这种查询一定不存在的数据对系统来说可能是一种危险,如果有人恶意用这种一定不存在的数据来频繁请求系统(准确的说是攻击系统),请求都会到达数据库层导致DB瘫痪从而引起系统故障. 解决方案 缓存穿透业内的解决方案已经比较成熟,主要常用的有以下几种: bloom filter:类似于哈希表的一种算法,用所有可能的查询

redis缓存穿透,缓存击穿,缓存雪崩原因+解决方案

###一.前言在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题. 为了

缓存穿透,缓存击穿,缓存雪崩的原理及解决方案

前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义.在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞.举例:如发起为id为"-1"的数据或id为特别大不存在的数据.这时的用户很可能是攻击者,攻击会导致数据库压力过大.

如何设计缓存系统:缓存穿透,缓存击穿,缓存雪崩解决方案分析

前言 设计一个缓存系统,不得不要考虑的问题就是:缓存穿透.缓存击穿与失效时的雪崩效应. 缓存穿透 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义. 在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞. 解决方案 有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bi