首页 > redis > redis中缓存穿透与缓存雪崩缓存击穿
2017
05-12

redis中缓存穿透与缓存雪崩缓存击穿

背景

缓存系统不得不考虑的另一个问题是缓存穿透与失效时的雪崩效应。

缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个存在的数据每次请求都要到存储层去查询,失去了缓存的意义。
有 很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟

缓存雪崩


雪崩的简单过程:

1、redis集群大面积故障

2、缓存失效,但依然大量请求访问缓存服务redis

3、redis大量失效后,大量请求转向到mysql数据库

4、mysql的调用量暴增,很快就扛不住了,甚至直接宕机

5、由于大量的应用服务依赖mysql和redis的服务,这个时候很快会演变成各服务器集群的雪崩,最后网站彻底崩溃。

如何预防缓存雪崩

1、缓存的高可用性

例如 Redis Sentinel 和 Redis Cluster 都实现了高可用。

2、缓存降级

可以利用ehcache等本地缓存(暂时支持),但主要还是对源服务访问进行限流、资源隔离(熔断)、降级等。

3、Redis备份和快速预热

4、提前演练


缓存击穿

缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案:

1. 定时刷新缓存或设置缓存永不过期,这个方法虽然很暴力,但是确实能解决大部分的问题;

2. 设置随机过期时间,这个方案对于缓存击穿来说就不太适用了,因为击穿只针对一个热点 key,只要它一失效,大量的访问就会击垮数据库;

3. 使用互斥锁,比如redis的 sexnx  memcache的add,获取到锁的请求才能去更新缓存,这时候注意设置锁的过期时间,防止意外crash,锁没法释放,其他请求则等待处理结果

4. 多级缓存,双缓存机制

本文》有 0 条评论

留下一个回复