redis学习-缓存穿透、缓存击穿、缓存雪崩

1.缓存穿透

大量查询数据库中没有的数据。

当用户在redis缓存中查询不到想要的信息时,会进入数据库中查询,此时如果同一时间有大量用户从redis中查询不到信息,就都会去数据库中查询,此时数据库就可能会因为压力过大而停止服务,这就是缓存穿透。

解决办法:

  • 布隆过滤器

是一种数据结构,对所有可能用到的参数以hash形式存储,当用户发起查询时会先在控制层进行校验,如果没有所请求信息的参数就不会进入数据库中查询,从而过滤掉这些对不存在信息的查询请求,减轻了数据库的压力。

  • 缓存空对象

即如果在数据库中查询不到,redis就会存储一个空串并附上过期时间,当再次查询这条信息时就会直接从redis中获取这个空串,避免短时间内再次从数据库中查询的现象。

这种方式有两个缺点,一是可能会出现一致性的问题,在过期时间内如果数据库中新增了这条信息,redis只能等空串过期后才可能发现,这就会出现redis和数据库中的信息不一致的情况;二是这种方法会在redis中存入大量空串进而占用redis的内存。

2.缓存击穿

大量查询redis中过期的热点数据。

一般是由于热点数据造成的。如果热点数据刚好过期,此时若有大量用户再次请求这些数据,就只能去数据库中查询,这很可能就会导致数据库在这一时间压力过大而停止服务。

解决办法:

  • 过期时间设置为永久

当设置为永久后,这些数据就不会过期,所以就不会出现缓存击穿的现象。但这些数据会囤积在redis中,可能会造成内存不足的问题。

  • 使用分布式锁

使用分布式锁用来保证对于同一条信息同一时间内只有一个线程能够访问数据库,其他线程只能等待,这就将高并发的压力转移到了分布式锁上。虽然减轻了数据库的压力,但考验分布式锁。

3.缓存雪崩

当大量热点数据集中过期后,如果这些热点数据被频繁使用将对数据库造成大量周期性压力;其中缓存服务器宕机造成的雪崩损失比较大,因为一旦宕机压力就都会转移到数据库上,这带来的风险是无法预知的。

解决办法:

  • redis高可用

既然缓存服务器宕机造成的风险较大,不如多设几台缓存服务器,当一台服务器宕机后可以使用其他服务器继续工作,其实就是搭建集群。

  • 限流降级

当热点数据过期后,可以通过加锁或者队列来限制同一时间对同一数据的访问量,其他访问请求等待。

  • 数据预热

在出现高并发访问之前先将可能高频访问的数据访问一遍,这样这些数据就会存到内存中,保证了访问开始后的一段时间内这些热点数据不会过期。

相关推荐
an12321212 小时前
ARM嵌入式学习笔记:SPI通信协议详解
arm开发·笔记·学习
by209993 小时前
从结构体到对象:正式学习C++类的骨架、封装与this指针
c++·经验分享·学习
乌暮3 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
小雪崩4 小时前
嵌入式学习 day60:ARM汇编——触摸屏与SPI
汇编·arm开发·学习
wefg14 小时前
【Redis】初识 Redis
数据库·redis·缓存
问天_观心5 小时前
大模型训练与推理优化(二)
人工智能·深度学习·学习·大模型·transformer
海海不掉头发6 小时前
软件项目管理学习笔记-从软件危机到敏捷与DevOps
笔记·学习·devops
周之瑞6 小时前
技术手记|Redis 与数据库事务不在一个世界:afterCommit、显式补偿还是 Canal?
redis
hacker_LeeFei6 小时前
Windows 下配置 Redis 8.10.2 开机自启:一次踩坑全记录
数据库·windows·redis
传奇开心果编程7 小时前
【SwiftUI入门练中学】第7课 动画与手势:让界面更灵动
学习·macos·ui·ios·swiftui·swift