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

目录

缓存穿透

定义:

解决方法:

缓存击穿

定义:

解决方案:

缓存雪崩

定义:

解决方案:

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


缓存穿透

定义:

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

解决方法:

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

缓存击穿

定义:

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

解决方案:

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

缓存雪崩

定义:

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

解决方案:

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

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

  • 缓存穿透:请求的数据在缓存中不存在。请求的数据在数据库中也不存在(例如非法请求或恶意攻击)。
  • 缓存击穿:某个热点数据的缓存过期了。在数据失效的瞬间,大量请求涌入,数据库无法承受。
  • 缓存雪崩:缓存中的大量数据在同一时间过期。缓存服务突然崩溃或失效,所有请求直接访问数据库。
相关推荐
环能jvav大师4 分钟前
基于R语言的统计分析基础:使用SQL语句操作数据集
开发语言·数据库·sql·数据分析·r语言·sqlite
骆晨学长23 分钟前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
@月落29 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
楠枬39 分钟前
MySQL数据的增删改查(一)
数据库·mysql
goTsHgo44 分钟前
从底层原理上解释 clickhouse 保证完全的幂等性
数据库·clickhouse
阿华的代码王国2 小时前
MySQL ------- 索引(B树B+树)
数据库·mysql
码爸3 小时前
flink 批量压缩redis集群 sink
大数据·redis·flink
Hello.Reader3 小时前
StarRocks实时分析数据库的基础与应用
大数据·数据库
执键行天涯3 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
yanglamei19623 小时前
基于GIKT深度知识追踪模型的习题推荐系统源代码+数据库+使用说明,后端采用flask,前端采用vue
前端·数据库·flask