Redis——缓存击穿、穿透、雪崩

createh52周前 (06-29)技术教程5

1、缓存穿透:

(1)问题描述:key对应的数据并不存在,每次请求访问key时,缓存中查找不到,请求都会直接访问到数据库中去,请求量超出数据库时,便会导致数据库崩溃。如一个用户id不存在,数据库与缓存都不存在该id,此时黑客便可以利用此漏洞不断访问该id,造成数据库崩溃。

(2)解决方法:

①对空值缓存:如果一个查询数据为空(不管数据是否存在),都对该空结果进行缓存,其过期时间会设置非常短。

②设置可以访问名单:使用bitmaps类型定义一个可以访问名单,名单id作为bitmaps的偏移量,每次访问时与bitmaps中的id进行比较,如果访问id不在bitmaps中,则进行拦截,不给其访问。

③采用布隆过滤器:布隆过滤器可以判断元素是否存在集合中,他的优点是空间效率和查询时间都比一般算法快,缺点是有一定的误识别率和删除困难。

④进行实时监控:对于redis缓存中命中率急速下降时,迅速排查访问对象和访问数据,将其设置为黑名单。

2.缓存击穿:

(1)问题描述:key中对应数据存在,当key中对应的数据在缓存中过期,而此时又有大量请求访问该数据,缓存中过期了,请求会直接访问数据库并回设到缓存中,高并发访问数据库会导致数据库崩溃。

(2)解决方案:

①预先设置热门数据:在redis高峰访问时期,提前设置热门数据到缓存中,或适当延长缓存中key过期时间。

②实时调整:实时监控哪些数据热门,实时调整key过期时间。

③对于热点key设置永不过期。

3、缓存雪崩·:

(1)问题描述:key中对应数据存在,在某一时刻,缓存中大量key过期,而此时大量高并发请求访问,会直接访问后端数据库,导致数据库崩溃。

注意:缓存击穿是指一个key对应缓存数据过期,缓存雪崩是大部分key对应缓存数据过期

正常访问下如图:

缓存失效瞬间如下图:

(2)解决方法:

①构建多级缓存机制:nginx缓存+redis缓存+其他缓存。

②设置过期标志更新缓存:记录缓存数据是否过期,如果过期会触发另外一个线程去在后台更新实时key的缓存。

③将缓存可以时间分散:如在原有缓存时间基础上增加一个随机值,这个值可以在1-5分钟随机,这样过期时间重复率就会降低,防止大量key同时过期。

④使用锁或队列机制:使用锁或队列保证不会有大量线程一次性对数据库进行读写,从而避免大量并发请求访问数据库,该方法不适用于高并发情况。

相关文章

如何解决服务器缓存过高

如果服务器缓存过高,可以尝试以下方法来解决:一、分析缓存来源确定是哪种缓存导致的问题,例如 Web 服务器缓存、数据库缓存、操作系统缓存等。如需购买服务器可以在网址栏搜索 218.0.48.3:880...

使用nginx做前端服务器可以设置类似的静态文件客户端缓存

可以从图片、css、js等文件缓存到客户端,从而提升网站运行速度,降低服务器的压力,提升客户体验度。 而图片、css、js等文件往往会占用掉一个网站大量的服务器带宽和页面载入时间,如果使用nginx做...

【Redis】Redis应用问题-缓存穿透缓存击穿、缓存雪崩及解决方案

在我们使用redis时,也会存在一些问题,导致请求直接打到数据库上,导致数据库挂掉。下面我们来说说这些问题及解决方案。1、缓存穿透1.1 场景一个请求进来后,先去redis进行查找,redis存在,则...

大模型实战:Flask+H5三件套实现大模型基础聊天界面

本文使用 Flask 和 H5 三件套(HTML+JS+CSS)实现大模型聊天应用的基本方式话不多说,先贴上实现效果:流式输出:思考输出:聊天界面模型设置:模型设置会话切换:前言大模型的聊天应用从功能...

马上要高考查分了,你是公司的Java架构师,如何设计系统架构呢?

马上要高考查分了,你是公司的Java架构师,如何设计系统架构呢?作为Java架构师,高考查分系统的设计需应对瞬时百万级高并发、数据强一致性、高可用及安全要求。以下是我的技术方案与架构设计,结合分布式、...

Tomcat中js文件过大控制台报ERR_CONTENT_LENGTH_MISMATCH 200

浏览器控制台报ERR_CONTENT_LENGTH_MISMATCH 200错误。百度上都说是nginx缓存文件权限不够造成的,实际上没有用nginx代理。只用了Tomcat.分析发现访问出错的文件主...