Redis的缓存穿透、击穿、雪崩

目录

缓存穿透

定义:

解决方法:

缓存击穿

定义:

解决方案:

缓存雪崩

定义:

解决方案:

缓存穿透、缓存击穿和缓存雪崩的区别


缓存穿透

定义:

查询一个不存在的数据,数据库未查询到数据,Redis也没有缓存这条数据,导致每次都访问数据库,从而导致数据库压力增加。

解决方法:

  • 布隆过滤器
    • 优点:可以快速判断一个元素是否在集合中,可以避免不必要的数据查询。
    • 缺点:布隆过滤器可能会认为某个元素存在,但是实际不存在,从而造成误判的情况。同时需要提前把数据标识添加到布隆过滤器中,并且不支持删除操作。
  • 缓存空对象
    • 优点:在查询数据库时,如果数据不存在,就把空值(null)存入到缓存中。当再次查询时,将不会查询数据库。
    • 缺点:空对象会占用缓存空间,从而造成缓存浪费情况,同时需要处理数据空值问题。

缓存击穿

定义:

当Redis中某一缓存失效时,多个请求同时访问该数据,Redis无法拦截,请求直接访问数据库,就会造成缓冲击穿。缓存击穿会造成数据库压力急剧增加。

解决方案:

  • 逻辑过期:热点数据不设置过期时间,在缓存数据中添加过期时间字段,当访问缓存数据时发现数据过期则更新数据。
    • 优点:具有高可用性,避免了数据库压力,同时不会因为数据更新阻塞用户请求
    • 缺点:数据更新期间缓存中存在过期数据,会影响一定的数据一致性。同时需要定时清理过期数据。
  • 分布式锁
    • 优点:通过加锁,保证同时只有一个线程访问数据库并进行缓存更新,后续线程会等待第一次线程更新完缓存后获取缓存数据。
    • 缺点:高并发时锁竞争激烈,影响性能。如果锁失效,会导致缓存击穿。

缓存雪崩

定义:

当Redis中大量数据同时过期,就会导致缓存雪崩,雪崩会导致数据库压力激增,从而造成系统性能下降,甚至造成崩溃。

解决方案:

  • 缓存过期时间设置成随机值
    • 优点:避免了大量缓存同时过期,操作简便,不需要复杂代码。
    • 缺点:数据缓存时间不同,可能会出现数据不一致问题,同时有极小概率数据还是会同时失效。
  • 使用多级缓存,如本地缓存加分布式缓存
    • 优点:可以提升缓存的命中率,从而减少直接访问数据库的机会。
    • 缺点:增加了系统的复杂度,需要同时管理多重缓存,同时需要额外的计算和储存资源。

缓存穿透、缓存击穿和缓存雪崩的区别

  • 缓存穿透:请求的数据在缓存中不存在。请求的数据在数据库中也不存在(例如非法请求或恶意攻击)。
  • 缓存击穿:某个热点数据的缓存过期了。在数据失效的瞬间,大量请求涌入,数据库无法承受。
  • 缓存雪崩:缓存中的大量数据在同一时间过期。缓存服务突然崩溃或失效,所有请求直接访问数据库。
相关推荐
fen_fen1 小时前
Oracle建表语句示例
数据库·oracle
砚边数影3 小时前
数据可视化入门:Matplotlib 基础语法与折线图绘制
数据库·信息可视化·matplotlib·数据可视化·kingbase·数据库平替用金仓·金仓数据库
orange_tt3 小时前
Djiango配置Celery
数据库·sqlite
云小逸4 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
肉包_5114 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
霖霖总总4 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
ALex_zry5 小时前
Redis Cluster 分布式缓存架构设计与实践
redis·分布式·缓存
此刻你5 小时前
常用的 SQL 语句
数据库·sql·oracle
それども6 小时前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql
·云扬·6 小时前
MySQL Binlog 配置指南与核心作用解析
数据库·mysql·adb