redis是为了解决传统的关系型数据库的某些问题而诞生的。因为关系型数据库数据存储在硬盘内,而硬盘的反应时间相比于内存和cpu慢的多,如果用户的每一次请求都要到硬盘去读取数据,那整个应用的使用体验将大打折扣。所以使用redis将数据库中的部分数据加载到内存中,当用户访问此数据时,直接可以从内存中获取,大大提升了效率。但redis毕竟只是作为一个缓存,redis中存储的数据也是从硬盘中加载过来的,一般选择部分访问频率高的数据加载到redis,提升了响应速度,也节省了磁盘I/O资源。当用户请求某数据,先去redis缓存中查看,如果有直接返回,快速高效。如果没有就得去数据库(硬盘)中查看,如果数据库有就更新redis。但是碰到下面三种情况时,redis缓存就失去了作用:
缓存穿透问题
现象:访问缓存和数据库中都没有的数据,可能被恶意用户反复发起此种请求,导致数据库压力过大。
解决方案:
接口层增加一次检验,拦截明显错误的数据访问请求,如对查询id<0的用户的请求直接拦截。
对数据库也没有取到的值设置一个null值,存到缓存中,可以设置较短的过期时间,这样就避免了相同无效请求重复访问数据库。
使用布隆过滤器。
缓存击穿问题
现象:热点数据缓存到期,但此时有大量并发请求访问此热点数据,所有请求直接转到数据库,造成数据库瞬间压力过大甚至宕机。
解决方案:
设置热点数据永不过期;
加互斥锁,当缓存到期时,后续请求不是直接转向数据库而是等待缓存重新加载。
缓存雪崩问题
现象:大量数据同时到期,导致大量请求直接打到数据库,导致数据库压力过大甚至宕机
解决方案:
设置热点数据永不过期;
不同数据的缓存过期时间不要设置相同,避免多个数据同时过期,瞬间增大数据库压力。
redis的缓存穿透,缓存击穿,缓存雪崩
最新推荐文章于 2024-10-31 16:14:37 发布