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

1.缓存穿透

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

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

解决办法:

  • 布隆过滤器

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

  • 缓存空对象

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

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

2.缓存击穿

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

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

解决办法:

  • 过期时间设置为永久

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

  • 使用分布式锁

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

3.缓存雪崩

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

解决办法:

  • redis高可用

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

  • 限流降级

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

  • 数据预热

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

相关推荐
@_@哆啦A梦33 分钟前
Redis 基础命令
java·数据库·redis
Fhd-学习笔记36 分钟前
《大语言模型》综述学习笔记
笔记·学习·语言模型
简知圈2 小时前
【04-自己画P封装,并添加已有3D封装】
笔记·stm32·单片机·学习·pcb工艺
YxVoyager2 小时前
GAMES101学习笔记(五):Texture 纹理(纹理映射、重心坐标、纹理贴图)
笔记·学习·图形渲染
徐某人..3 小时前
ARM嵌入式学习--第十天(UART)
arm开发·单片机·学习·arm
gentle coder3 小时前
Redis_Redission的入门案例、多主案例搭建、分布式锁进行加锁、解锁底层源码解析
java·redis·分布式
Buring_learn3 小时前
代理模式 -- 学习笔记
笔记·学习·代理模式
萝卜青今天也要开心3 小时前
读书笔记-《Redis设计与实现》(一)数据结构与对象(下)
java·数据结构·redis·学习
java1234_小锋4 小时前
说说Redis的内存淘汰策略?
数据库·redis·缓存
霸王蟹5 小时前
文本复制兼容方案最佳实现落地。
前端·javascript·vue.js·笔记·学习