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

1.缓存穿透

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

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

解决办法:

  • 布隆过滤器

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

  • 缓存空对象

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

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

2.缓存击穿

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

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

解决办法:

  • 过期时间设置为永久

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

  • 使用分布式锁

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

3.缓存雪崩

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

解决办法:

  • redis高可用

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

  • 限流降级

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

  • 数据预热

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

相关推荐
wdfk_prog13 小时前
[Linux]学习笔记系列 -- [kernel][time]tick
linux·笔记·学习
祈祷苍天赐我java之术14 小时前
如何在Java中整合Redis?
java·开发语言·redis
我命由我1234514 小时前
Photoshop - Photoshop 工具栏(22)单行选框工具
学习·ui·职场和发展·求职招聘·职场发展·学习方法·photoshop
User_芊芊君子15 小时前
【成长纪实】我的鸿蒙成长之路:从“小白”到独立开发,带你走进鸿蒙的世界
学习·华为·harmonyos·鸿蒙开发
星梦清河15 小时前
Redis(四):缓存击穿及其解决方案(SpringBoot+mybatis-plus)
spring boot·redis·缓存
傻啦嘿哟16 小时前
用Redis实现爬虫URL去重与队列管理:从原理到实战的极简指南
数据库·redis·爬虫
嵌入式-老费17 小时前
自己动手写深度学习框架(快速学习python和关联库)
开发语言·python·学习
执笔论英雄18 小时前
【大模型训练】zero 学习及deepseed实战
人工智能·深度学习·学习
@爱学习的小趴菜19 小时前
Redis服务器配置
服务器·数据库·redis
前路不黑暗@19 小时前
Java:继承与多态
java·开发语言·windows·经验分享·笔记·学习·学习方法