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

目录

缓存穿透

定义:

解决方法:

缓存击穿

定义:

解决方案:

缓存雪崩

定义:

解决方案:

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


缓存穿透

定义:

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

解决方法:

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

缓存击穿

定义:

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

解决方案:

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

缓存雪崩

定义:

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

解决方案:

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

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

  • 缓存穿透:请求的数据在缓存中不存在。请求的数据在数据库中也不存在(例如非法请求或恶意攻击)。
  • 缓存击穿:某个热点数据的缓存过期了。在数据失效的瞬间,大量请求涌入,数据库无法承受。
  • 缓存雪崩:缓存中的大量数据在同一时间过期。缓存服务突然崩溃或失效,所有请求直接访问数据库。
相关推荐
广州智造3 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥6 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸8 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
呦呦鹿鸣Rzh8 小时前
缓存的相关内容
缓存
dddaidai1238 小时前
Redis解析
数据库·redis·缓存
数据库幼崽8 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd8 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
工一木子8 小时前
【Java项目脚手架系列】第七篇:Spring Boot + Redis项目脚手架
java·spring boot·redis
betazhou9 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh9 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring