【缓存】缓存击穿、缓存穿透、缓存雪崩

缓存的作用

缓存的主要目的是减轻数据库的压力。

当有请求来时,先去查找缓存,缓存有数据则直接返回;

缓存没有数据,再去数据库请求,将数据写入缓存再返回;

如果数据库中也没有数据,那可能就是程序有问题了,返回错误信息。

缓存穿透

如果有攻击者伪造了一个请求,而且请求的数据再缓存中找不到,那么每次请求,都会从数据库中查找。缓存就像不存在一样,这种现象就是缓存穿透。如果攻击者利用这样的漏洞,发起多次请求,给数据库就会造成巨大压力。

解决方案:

1)对请求进行校验,比如请求的数据,缓存中肯定没有,并且数据库中也肯定没有的情况,直接拦截过滤掉。

2)缓存空值。缓存中没找到请求的数据,数据库中也没有请求的数据,那么把这个请求数据保存在缓存里,但是置为空。下次请求相同的数据,判断是否为空值,如果是空值,返回错误信息;如果不为空值,返回请求数据即可。

3)如果数据量比较小,可以全部放在缓存中,有请求的数据就返回,没有就返回空。

4)使用布隆过滤器可以过滤掉大量恶意请求不存在数据的情况。(待补充)但是布隆过滤器会来带两个新的问题:1)存在误杀的情况;2)如果数据有变化,需要实时同步到布隆过滤器。

缓存击穿

一般缓存的数据都有有效期,当某个数据有效期过了,对该数据的所有请求统统走向了数据库,数据库由于突然大量的请求访问可能就会崩掉了,这就是缓存击穿。

解决方案:

1)当缓存数据即将失效前重新设置有效期,比如数据30分钟后失效,在20分钟的时候重新设置数据有效期为30分钟。

缓存雪崩

缓存雪崩是缓存击穿的升级版。当有多个缓存数据同时失效了,大批量的请求都走向了数据库访问,数据库压力骤增很有可能崩掉,这就是缓存雪崩。

解决方案:

1)不同的缓存数据在过期时间的基础上添加1~60秒的随机时间,防止大批量的数据同时失效,可以有效减轻缓存雪崩。

2)分布式高可用,如redis可以设置哨兵,关注服务器的情况,如果某一台服务器因为缓存雪崩导致不可用了,立马调度另一台服务器顶上。

相关推荐
绿算技术6 小时前
存储新势力:助力DeepSeek一体机
人工智能·科技·缓存·fpga开发
zru_960212 小时前
Docker 部署 Redis:快速搭建高效缓存服务
redis·缓存·docker
axinawang12 小时前
springboot整合redis实现缓存
spring boot·redis·缓存
for6214 小时前
本地缓存大杀器-Caffeine
缓存·caffeine·本地缓存
听闻风很好吃17 小时前
Redis高级数据类型解析(二)——Set、Sorted Set与Geo实战指南
数据库·redis·缓存
陈大大陈17 小时前
基于 C++ 的用户认证系统开发:从注册登录到Redis 缓存优化
java·linux·开发语言·数据结构·c++·算法·缓存
编程在手天下我有17 小时前
缓存与数据库数据一致性:旁路缓存、读写穿透和异步写入模式解析
数据库·缓存·oracle·软件开发·架构设计·数据一致性
云攀登者-望正茂17 小时前
Redis 及其在系统设计中的作用
数据库·redis·缓存
冼紫菜18 小时前
基于Redis实现高并发抢券系统的数据同步方案详解
java·数据库·redis·后端·mysql·缓存·性能优化
AnsenZhu1 天前
Redis Cluster 使用 CRC16 算法实现 Slot 槽位分片的核心细节
数据库·redis·缓存·crc16