0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Redis缓存预热+缓存雪崩+缓存击穿+缓存穿透要点简析

马哥Linux运维 来源:51CTO 2023-12-25 09:41 次阅读

1、缓存预热

1、定义

缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。

避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!


2、解决方案

1)直接写个缓存刷新页面,上线时手工操作下。
2)数据量不大,可以在项目启动的时候自动进行加载。
3)定时刷新缓存。

2、缓存雪崩

发生原因
redis主机挂了,redis全面崩溃,偏硬件运维
redis中有大量key同时过期大面积失效,偏软件开发


预防和解决
redis中key设置为永不过期or过期时间错开
redis缓存集群实现高可用
    主从+哨兵
    redis cluster
    开启redis持久化机制aof/rdb,尽快恢复缓存集群
多缓存结合预防雪崩
    ehcache本地缓存+redis缓存
服务降级
    Hystrix或者阿里sentinel限流&降级

3、缓存击穿

3.1、是什么

请求去查询一条记录,先查redis无,后查mysql无,都查询不到该条记录
但是请求每次都会打到数据库上面去,导致后台数据库压力暴增,这种现象称为缓存穿透,rendis变成了一个摆设


简单来说,本来无一物,两库都没有
即不在redis缓存库,也不在mysql,数据库存在被多次暴击风险

3.2、解决

fc5b0896-a244-11ee-8b88-92fbcf53809c.png

方案1:空对象缓存或者缺省值

第一种解决方案,回写增强
如果发生了缓存穿透,我们可以针对要查询的数据,在Redis里存一个和业务部门商量后确定的缺省值(比如,零、负数、defaultNull等)。
比如,键uid:abcdxxx,值defaultNull作为案例的key和value
先去redis查键uid:abcdxxx没有,再去mysql查没有获得 ,这就发生了一次穿透现象。


but,可以增强回写机制
mysql也查不到的话也让redis存入刚刚查不到的key并保护mysql。
第一次来查询uid:abcdxxx,redis和mysql都没有,返回null给调用者,但是增强回写后第二次来查uid:abcdxxx,此时redis就有值了。
可以直接从Redis中读取default缺省值返回给业务应用程序,避免了把大量请求发送给mysql处理,打爆mysql。


但是,此方法架不住黑客的恶意攻击,有缺陷......,只能解决key相同的情况


黑客或恶意攻击
黑客会对你的系统进行攻击,拿一个不存在的id去查询数据,会产生大量的请求到数据库去查询,可能会导致你的数据库由于压力过大而宕掉


key相同打你系统
  第一次打到mysql空对象缓存后第二次就返回default Null缺省值
  避免mysql被攻击,不用再到数据库中去走一圈了
key不同打你系统
  由于存在空对象缓存和缓存会写(看自己业务不限死)
  redis中的无关紧要的key也会越写越多(记得设置redis过期时间)

方案2:Google布隆过滤器Guava解决缓存穿透

白名单架构

fc71f7b8-a244-11ee-8b88-92fbcf53809c.png

布隆过滤器说明

fc86e56a-a244-11ee-8b88-92fbcf53809c.png

误判问题,但是概率小可以接受,不能从布隆过滤器删除
全部合法的key都需要放入Guava版布隆过滤器和redis里面,不然数据就是返回null

4、缓存穿透

4.1、是什么

大量的请求同时查询一个key时,此时这个key正好失效了,导致大量的请求都打到数据库上面去
简单说就是热点key突然失效了,暴打mysql

4.1、危害

会造成某一时刻数据库请求量过大,压力剧增
一般技术部门需要知道热点key时那些,防止击穿

4.1、解决


热点key失效
时间到了自然清除但还被访问到
delete掉的key,刚巧又被访问


方案1:
差异失效时间,对于访问频繁的热点key,干脆就不设置过期时间
方案2:
互斥更新,采用双检加锁策略


多个线程同时去查询数据库的这条数据,那么我们可以在第一个查询数据的请求上使用一个 互斥锁来锁住它。
其他的线程走到这一步拿不到锁就等着,等第一个线程查询到了数据,然后做缓存。后面的线程进来发现已经有缓存了,就直接走缓存。


5、总结

fc9bca8e-a244-11ee-8b88-92fbcf53809c.png

好了,今天的小知识你学会了吗?

链接:https://blog.51cto.com/u_13236892/8955597







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MySQL
    +关注

    关注

    1

    文章

    801

    浏览量

    26437
  • 过滤器
    +关注

    关注

    1

    文章

    427

    浏览量

    19551
  • Redis
    +关注

    关注

    0

    文章

    371

    浏览量

    10844

原文标题:讲透Redis 缓存预热+缓存雪崩+缓存击穿+缓存穿透

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何选择合适的本地缓存

    小编最近在使用系统的时候,发现尽管应用已经使用了 redis 缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地
    的头像 发表于 01-18 11:19 808次阅读
    如何选择合适的本地<b class='flag-5'>缓存</b>?

    使用Redis缓存model层

    〈译〉使用REDIS处理RAILS MODEL缓存
    发表于 04-18 17:07

    redis缓存注解怎么使用

    spring boot —— redis 缓存注解使用教程
    发表于 09-11 14:43

    缓存的作用和设计模式

    查询数据,获取数据后并加载到缓存缓存失效:数据更新写到数据库,操作成功后,让缓存失效,查询时候再重新加载;缓存穿透:查询数据库不存在的对象
    发表于 01-05 17:57

    Mybatis缓存之一级缓存

    本文主要讲mybatis的一级缓存,一级缓存是SqlSession级别的缓存。mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybaits提供一级
    发表于 11-27 20:44 1217次阅读
    Mybatis<b class='flag-5'>缓存</b>之一级<b class='flag-5'>缓存</b>

    Java 使用Redis缓存工具的详细解说

    本文是关于Java 使用Redis缓存工具的详细解说。详细步骤请看下文
    的头像 发表于 02-09 14:10 7864次阅读
    Java 使用<b class='flag-5'>Redis</b><b class='flag-5'>缓存</b>工具的详细解说

    渲染中的帧缓存和深度缓存

    渲染涉及大量的缓存,这里缓存只是一个简单的存有像素数据的矩形内存块,最重要缓存是帧缓存和深度缓存
    的头像 发表于 05-14 11:44 6303次阅读
    渲染中的帧<b class='flag-5'>缓存</b>和深度<b class='flag-5'>缓存</b>

    解决缓存雪崩的6大解决办法

    使用Redis 哨兵模式或者Redis 集群部署方式,即便个别Redis 节点下线,整个缓存层依然可以使用。除此之外,还可以在多个机房部署 Redi
    发表于 09-13 11:37 2.7w次阅读

    什么是Web缓存,HTTP缓存和浏览器缓存的区别

    前端缓存主要是分为HTTP缓存和浏览器缓存。其中HTTP缓存是在HTTP请求传输时用到的缓存,主要在服务器代码上设置;而浏览器
    发表于 09-13 04:17 9420次阅读
    什么是Web<b class='flag-5'>缓存</b>,HTTP<b class='flag-5'>缓存</b>和浏览器<b class='flag-5'>缓存</b>的区别

    缓存的基本原理 缓存的分类

    缓存的主要手段有:浏览器缓存、CDN、反向代理、本地缓存、分布式缓存、数据库缓存
    发表于 06-13 12:04 4647次阅读

    缓存雪崩/穿透/击穿的解决方案

    缓存是我们项目应用肯定会使用,是我们数据库的守护神,能够保证数据库的稳定,能够提高整个系统的性能。一般我们采用市面上的redis、memcahce方案;redis已经非常强大了,每秒支持几万的连接时不成问题。
    发表于 01-26 09:44 1304次阅读
    <b class='flag-5'>缓存</b><b class='flag-5'>雪崩</b>/<b class='flag-5'>穿透</b>/<b class='flag-5'>击穿</b>的解决方案

    如何设计一个缓存系统?

    设计一个缓存系统,不得不要考虑的问题就是:缓存穿透缓存击穿与失效时的雪崩效应。
    的头像 发表于 02-08 11:40 2884次阅读

    如何在SpringBoot中解决Redis缓存穿透等问题

    今天给大家介绍一下如何在SpringBoot中解决Redis缓存穿透缓存击穿缓存
    的头像 发表于 04-28 11:35 706次阅读

    缓存穿透了如何解决

    首先来了解几个概念: 缓存穿透:大量请求根本不存在的key 缓存雪崩redis中大量key集体过期
    的头像 发表于 05-23 09:54 663次阅读
    <b class='flag-5'>缓存</b>被<b class='flag-5'>穿透</b>了如何解决

    聊聊本地缓存和分布式缓存

    本地缓存 :应用中的缓存组件,缓存组件和应用在同一进程中,缓存的读写非常快,没有网络开销。但各应用或集群的各节点都需要维护自己的单独缓存,无
    发表于 06-11 15:12 810次阅读
    聊聊本地<b class='flag-5'>缓存</b>和分布式<b class='flag-5'>缓存</b>