Redis缓存雪崩和穿透的解决方法(转载)

Redis缓存雪崩和穿透的解决方法

如何解决缓存雪崩?
如何解决缓存穿透?
如何保证缓存与数据库双写时一致的问题?

一、缓存雪崩

1.1什么是缓存雪崩?

回顾一下我们为什么要用缓存(Redis):

在这里插入图片描述

现在有个问题,如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了。

在这里插入图片描述

在前面学习我们都知道Redis不可能把所有的数据都缓存起来(内存昂贵且有限),所以Redis需要对数据设置过期时间,并采用的是惰性删除+定期删除两种策略对过期键删除。Redis对过期键的策略+持久化

如果缓存数据设置的过期时间是相同的,并且Redis恰好将这部分数据全部删光了。这就会导致在这段时间内,这些缓存同时失效,全部请求到数据库中。

这就是缓存雪崩:
Redis挂掉了,请求全部走数据库。
对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。
缓存雪崩如果发生了,很可能就把我们的数据库搞垮,导致整个服务瘫痪!

1.2如何解决缓存雪崩?

对于“对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。”这种情况,非常好解决:

解决方法:1、在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。

2、对于“Redis挂掉了,请求全部走数据库”这种情况,我们可以有以下的思路:
事发前:实现Redis的高可用(主从架构+Sentinel(哨兵) 或者Redis Cluster(集群)),尽量避免Redis挂掉这种情况发生
事发中:万一Redis真的挂了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)
事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据

二、缓存穿透

2.1什么是缓存穿透

比如,我们有一张数据库表,ID都是从1开始的(正数):

但是可能有黑客想把我的数据库搞垮,每次请求的ID都是负数。这会导致我的缓存就没用了,请求全部都找数据库去了,但数据库也没有这个值啊,所以每次都返回空出去。

缓存穿透是指查询一个一定不存在的数据。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。

在这里插入图片描述

这就是缓存穿透:
请求的数据在缓存大量不命中,导致请求走数据库。
缓存穿透如果发生了,也可能把我们的数据库搞垮,导致整个服务瘫痪!

2.1如何解决缓存穿透?

解决缓存穿透也有两种方案:

1、由于请求的参数是不合法的(每次都请求不存在的参数),于是我们可以使用布隆过滤器(BloomFilter)或者压缩filter提前拦截,不合法就不让这个请求到数据库层
当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓存里边获取了。
这种情况我们一般会将空对象设置一个较短的过期时间

缓存与数据库双写一致

3.1对于读操作,流程是这样的

上面讲缓存穿透的时候也提到了:如果从数据库查不到数据则不写入缓存。
一般我们对读操作的时候有这么一个固定的套路:

如果我们的数据在缓存里边有,那么就直接取缓存的。
如果缓存里没有我们想要的数据,我们会先去查询数据库,然后将数据库查出来的数据写到缓存中
最后将数据返回给请求

3.2什么是缓存与数据库双写一致问题?

如果仅仅查询的话,缓存的数据和数据库的数据是没问题的。但是,当我们要更新时候呢?各种情况很可能就造成数据库和缓存的数据不一致了

这里不一致指的是:数据库的数据跟缓存的数据不一致

在这里插入图片描述

从理论上说,只要我们设置了键的过期时间,我们就能保证缓存和数据库的数据最终是一致的。因为只要缓存数据过期了,就会被删除。随后读的时候,因为缓存里没有,就可以查数据库的数据,然后将数据库查出来的数据写入到缓存中。

除了设置过期时间,我们还需要做更多的措施来尽量避免数据库与缓存处于不一致的情况发生。

3.3对于更新操作

一般来说,执行更新操作时,我们会有两种选择:
先操作数据库,再操作缓存
先操作缓存,再操作数据库

首先,要明确的是,无论我们选择哪个,我们都希望这两个操作要么同时成功,要么同时失败。所以,这会演变成一个分布式事务的问题。

所以,如果原子性被破坏了,可能会有以下的情况:

操作数据库成功了,操作缓存失败了。
操作缓存成功了,操作数据库失败了。

如果第一步已经失败了,我们直接返回Exception出去就好了,第二步根本不会执行。

3.3.1操作缓存

操作缓存也有两种方案:

更新缓存
删除缓存

一般我们都是采取删除缓存缓存策略的,原因如下:

1、 高并发环境下,无论是先操作数据库还是后操作数据库而言,如果加上更新缓存,那就更加容易导致数据库与缓存数据不一致问题。(删除缓存直接和简单很多)
2、如果每次更新了数据库,都要更新缓存【这里指的是频繁更新的场景,这会耗费一定的性能】,倒不如直接删除掉。等再次读取时,缓存里没有,那我到数据库找,在数据库找到再写到缓存里边(体现懒加载)

基于这两点,对于缓存在更新时而言,都是建议执行删除操作!

正常的情况是这样的:

先操作数据库,成功;
再删除缓存,也成功;

如果原子性被破坏了:

第一步成功(操作数据库),第二步失败(删除缓存),会导致数据库里是新数据,而缓存里是旧数据。
如果第一步(操作数据库)就失败了,我们可以直接返回错误(Exception),不会出现数据不一致。

如果在高并发的场景下,出现数据库与缓存数据不一致的概率特别低,也不是没有:

1、 缓存刚好失效
2、线程A查询数据库,得一个旧值
3、线程B将新值写入数据库
4、线程B删除缓存
5、线程A将查到的旧值写入缓存
要达成上述情况,还是说一句概率特别低:

因为这个条件需要发生在读缓存时缓存失效,而且并发着有一个写操作。而实际上数据库的写操作会比读操作慢得多,而且还要锁表,而读操作必需在写操作前进入数据库操作,而又要晚于写操作更新缓存,所有的这些条件都具备的概率基本并不大。

删除缓存失败的解决思路:

将需要删除的key发送到消息队列中
自己消费消息,获得需要删除的key
不断重试删除操作,直到成功

3.3.3先删除缓存,再更新数据库

正常情况是这样的:
先删除缓存,成功;
再更新数据库,也成功;

如果原子性被破坏了:

第一步成功(删除缓存),第二步失败(更新数据库),数据库和缓存的数据还是一致的。
如果第一步(删除缓存)就失败了,我们可以直接返回错误(Exception),数据库和缓存的数据还是一致的。

看起来是很美好,但是我们在并发场景下分析一下,就知道还是有问题的了:

线程A删除了缓存
线程B查询,发现缓存已不存在
线程B去数据库查询得到旧值
线程B将旧值写入缓存
线程A将新值写入数据库

所以也会导致数据库和缓存不一致的问题。

并发下解决数据库与缓存不一致的思路:

将删除缓存、修改数据库、读取缓存等的操作积压到队列里边,实现串行化。
在这里插入图片描述

3.4对比两种策略

先删除缓存,再更新数据库
在高并发下表现不如意,在原子性被破坏时表现优异
先更新数据库,再删除缓存(Cache Aside Pattern设计模式)
在高并发下表现优异,在原子性被破坏时表现不如意

                                </div><div data-report-view="{&quot;mod&quot;:&quot;1585297308_001&quot;,&quot;dest&quot;:&quot;https://blog.csdn.net/qq_35433716/article/details/86375506&quot;,&quot;extend1&quot;:&quot;pc&quot;,&quot;ab&quot;:&quot;new&quot;}"><div></div></div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                            </div>
</article>
  • 点赞 3
  • 评论 4
  • 分享
    x

    海报分享

    扫一扫,分享海报

  • 收藏 33
  • 手机看

    分享到微信朋友圈

    x

    扫一扫,手机阅读

  • 关注
		<textarea class="comment-content" name="comment_content" id="comment_content" placeholder="优质评论可以帮助作者获得更高权重" maxlength="1000"></textarea>
		<div class="opt-box"> <!-- d-flex -->
			<div id="ubbtools" class="add_code">
				<a href="#insertcode" code="code" target="_self"><i class="icon iconfont icon-daima"></i></a>
			</div>
			<input type="hidden" id="comment_replyId" name="comment_replyId">
			<input type="hidden" id="article_id" name="article_id" value="86375506">
			<input type="hidden" id="comment_userId" name="comment_userId" value="">
			<input type="hidden" id="commentId" name="commentId" value="">
			<div class="dropdown" id="myDrap">
				<a class="dropdown-face d-flex align-items-center" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
				<div class="txt-selected text-truncate">添加代码片</div>
				<svg class="icon d-block" aria-hidden="true">
					<use xlink:href="#csdnc-triangledown"></use>
				</svg>
				</a>
				<ul class="dropdown-menu" id="commentCode" aria-labelledby="drop4">
					<li><a data-code="html">HTML/XML</a></li>
					<li><a data-code="objc">objective-c</a></li>
					<li><a data-code="ruby">Ruby</a></li>
					<li><a data-code="php">PHP</a></li>
					<li><a data-code="csharp">C</a></li>
					<li><a data-code="cpp">C++</a></li>
					<li><a data-code="javascript">JavaScript</a></li>
					<li><a data-code="python">Python</a></li>
					<li><a data-code="java">Java</a></li>
					<li><a data-code="css">CSS</a></li>
					<li><a data-code="sql">SQL</a></li>
					<li><a data-code="plain">其它</a></li>
				</ul>
			</div>  
			<div class="right-box">
                                    <span id="tip_comment" class="tip">还能输入<em>1000</em>个字符</span>
				<input type="button" class="btn btn-sm btn-cancel d-none" value="取消回复">
				<a data-report-click="{&quot;mod&quot;:&quot;1582594662_003&quot;,&quot;ab&quot;:&quot;new&quot;}"><input type="submit" class="btn btn-sm btn-comment" value="发表评论"></a>
			</div>
		</div>
	</form>
	<input type="button" class="bt-comment-show" value="评论">
</div>

<div class="comment-list-container" style="display: block;">
	<a id="comments"></a>
	<div class="comment-list-box"><ul class="comment-list"><li class="comment-line-box d-flex" data-commentid="12217988" data-replyname="ZhaoChengWeiCSDN">      <a target="_blank" href="https://me.csdn.net/ZhaoChengWeiCSDN"><img src="https://profile.csdnimg.cn/8/7/B/3_zhaochengweicsdn" username="ZhaoChengWeiCSDN" alt="ZhaoChengWeiCSDN" class="avatar"></a>        <div class="right-box ">          <div class="new-info-box clearfix">            <a class="comment-tag" target="_blank" href="https://blog.csdn.net/blogdevteam/article/details/103478461">码哥<img class="comment-tag-img" src="https://blog.csdn.net/static_files/template/new_img/commentTagArrow.png" title="码哥"></a><a target="_blank" href="https://me.csdn.net/ZhaoChengWeiCSDN"><span class="name ">Rain_storms</span></a><span class="colon">:</span><span class="floor-num"></span><span class="new-comment">mark,请问可以转载吗?我标明出处</span><span class="date" title="2020-05-14 20:25:33">2月前</span><span class="new-opt-box new-opt-box-bg"><a class="btn  btn-report" data-type="report">举报</a><span class="btn-bar"></span><a class="btn  btn-reply" data-type="reply"><img src="https://blog.csdn.net/static_files/template/new_img/replyOtherComment.png" title="回复">回复</a><a class="btn  btn-heart" data-type="heart"><div class="comment-like " data-commentid="12217988"><img class="comment-like-img unclickImg" src="https://blog.csdn.net/static_files/template/new_img/commentUnHeart.png" title="点赞"><img class="comment-like-img comment-like-img-hover" style="display:none" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><img class="comment-like-img clickedImg" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><span></span></div></a></span></div><div class="comment-like " data-commentid="12217988"><img class="comment-like-img unclickImg" src="https://blog.csdn.net/static_files/template/new_img/commentUnHeart.png" title="点赞"><img class="comment-like-img comment-like-img-hover" style="display:none" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><img class="comment-like-img clickedImg" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><span></span></div></div></li></ul><ul class="comment-list"><li class="comment-line-box d-flex" data-commentid="11882367" data-replyname="qq_36623320">      <a target="_blank" href="https://me.csdn.net/qq_36623320"><img src="https://profile.csdnimg.cn/F/0/F/3_qq_36623320" username="qq_36623320" alt="qq_36623320" class="avatar"></a>        <div class="right-box ">          <div class="new-info-box clearfix">            <a target="_blank" href="https://me.csdn.net/qq_36623320"><span class="name ">qq_36623320</span></a><span class="colon">:</span><span class="floor-num"></span><span class="new-comment">那个网址什么情况?</span><span class="date" title="2020-04-13 11:08:28">3月前</span><span class="new-opt-box new-opt-box-bg"><a class="btn  btn-report" data-type="report">举报</a><span class="btn-bar"></span><a class="btn  btn-reply" data-type="reply"><img src="https://blog.csdn.net/static_files/template/new_img/replyOtherComment.png" title="回复">回复</a><a class="btn  btn-heart" data-type="heart"><div class="comment-like " data-commentid="11882367"><img class="comment-like-img unclickImg" src="https://blog.csdn.net/static_files/template/new_img/commentUnHeart.png" title="点赞"><img class="comment-like-img comment-like-img-hover" style="display:none" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><img class="comment-like-img clickedImg" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><span></span></div></a></span></div><div class="comment-like " data-commentid="11882367"><img class="comment-like-img unclickImg" src="https://blog.csdn.net/static_files/template/new_img/commentUnHeart.png" title="点赞"><img class="comment-like-img comment-like-img-hover" style="display:none" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><img class="comment-like-img clickedImg" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><span></span></div></div></li></ul><ul class="comment-list"><li class="comment-line-box d-flex" data-commentid="11331056" data-replyname="weixin_41281770">      <a target="_blank" href="https://me.csdn.net/weixin_41281770"><img src="https://profile.csdnimg.cn/4/7/E/3_weixin_41281770" username="weixin_41281770" alt="weixin_41281770" class="avatar"></a>        <div class="right-box ">          <div class="new-info-box clearfix">            <a target="_blank" href="https://me.csdn.net/weixin_41281770"><span class="name ">勇哥有把钝刀</span></a><span class="colon">:</span><span class="floor-num"></span><span class="new-comment">可以转载吗</span><span class="date" title="2020-01-16 13:50:16">6月前</span><span class="new-opt-box new-opt-box-bg"><a class="btn  btn-report" data-type="report">举报</a><span class="btn-bar"></span><a class="btn  btn-reply" data-type="reply"><img src="https://blog.csdn.net/static_files/template/new_img/replyOtherComment.png" title="回复">回复</a><a class="btn  btn-heart" data-type="heart"><div class="comment-like " data-commentid="11331056"><img class="comment-like-img unclickImg" src="https://blog.csdn.net/static_files/template/new_img/commentUnHeart.png" title="点赞"><img class="comment-like-img comment-like-img-hover" style="display:none" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><img class="comment-like-img clickedImg" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><span></span></div></a></span></div><div class="comment-like " data-commentid="11331056"><img class="comment-like-img unclickImg" src="https://blog.csdn.net/static_files/template/new_img/commentUnHeart.png" title="点赞"><img class="comment-like-img comment-like-img-hover" style="display:none" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><img class="comment-like-img clickedImg" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><span></span></div></div></li></ul><ul class="comment-list"><li class="comment-line-box d-flex" data-commentid="10940229" data-replyname="luoqinglong850102">      <a target="_blank" href="https://me.csdn.net/luoqinglong850102"><img src="https://profile.csdnimg.cn/C/E/3/3_luoqinglong850102" username="luoqinglong850102" alt="luoqinglong850102" class="avatar"></a>        <div class="right-box ">          <div class="new-info-box clearfix">            <a class="comment-tag" target="_blank" href="https://blog.csdn.net/blogdevteam/article/details/103478461">码哥<img class="comment-tag-img" src="https://blog.csdn.net/static_files/template/new_img/commentTagArrow.png" title="码哥"></a><a target="_blank" href="https://me.csdn.net/luoqinglong850102"><span class="name ">luck_man911</span></a><span class="colon">:</span><span class="floor-num"></span><span class="new-comment">3.4对比两种策略,这两种策略都无法保证数据一致性,要加乐观锁,更新数据库后,更新缓存。你只删除缓存没更新。</span><span class="date" title="2019-11-17 22:33:07">7月前</span><span class="new-opt-box new-opt-box-bg"><a class="btn  btn-report" data-type="report">举报</a><span class="btn-bar"></span><a class="btn  btn-reply" data-type="reply"><img src="https://blog.csdn.net/static_files/template/new_img/replyOtherComment.png" title="回复">回复</a><a class="btn  btn-heart" data-type="heart"><div class="comment-like " data-commentid="10940229"><img class="comment-like-img unclickImg" src="https://blog.csdn.net/static_files/template/new_img/commentUnHeart.png" title="点赞"><img class="comment-like-img comment-like-img-hover" style="display:none" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><img class="comment-like-img clickedImg" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><span></span></div></a></span></div><div class="comment-like " data-commentid="10940229"><img class="comment-like-img unclickImg" src="https://blog.csdn.net/static_files/template/new_img/commentUnHeart.png" title="点赞"><img class="comment-like-img comment-like-img-hover" style="display:none" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><img class="comment-like-img clickedImg" src="https://blog.csdn.net/static_files/template/new_img/commentActiveHeart.png" title="点赞"><span></span></div></div></li></ul></div>
	<div id="commentPage" class="pagination-box d-none" style="display: block;"><div id="Paging_06104080057242742" class="ui-paging-container"><ul><li class="js-page-first js-page-action ui-pager ui-pager-disabled"></li><li class="js-page-prev js-page-action ui-pager ui-pager-disabled">上一页</li><li data-page="1" class="ui-pager focus">1</li><li class="js-page-next js-page-action ui-pager ui-pager-disabled">下一页</li><li class="js-page-last js-page-action ui-pager ui-pager-disabled"></li></ul></div></div>
	
</div>
                <!-- <div class="recommend-item-box type_hot_word">
                <div class="content clearfix">
                    <div class="float-left">
                                                                            <span>
                            <a href="https://java.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://java.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://java.csdn.net/","index":"#"}'  target="_blank">
                            Java</a>
                        </span>
                                                    <span>
                            <a href="https://c1.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://c1.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://c1.csdn.net/","index":"#"}'  target="_blank">
                            C语言</a>
                        </span>
                                                    <span>
                            <a href="https://python.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://python.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://python.csdn.net/","index":"#"}'  target="_blank">
                            Python</a>
                        </span>
                                                    <span>
                            <a href="https://cplus.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://cplus.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://cplus.csdn.net/","index":"#"}'  target="_blank">
                            C++</a>
                        </span>
                                                    <span>
                            <a href="https://csharp.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://csharp.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://csharp.csdn.net/","index":"#"}'  target="_blank">
                            C#</a>
                        </span>
                                                    <span>
                            <a href="https://vbn.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://vbn.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://vbn.csdn.net/","index":"#"}'  target="_blank">
                            Visual Basic .NET</a>
                        </span>
                                                    <span>
                            <a href="https://js.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://js.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://js.csdn.net/","index":"#"}'  target="_blank">
                            JavaScript</a>
                        </span>
                                                    <span>
                            <a href="https://php.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://php.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://php.csdn.net/","index":"#"}'  target="_blank">
                            PHP</a>
                        </span>
                                                    <span>
                            <a href="https://sql.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://sql.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://sql.csdn.net/","index":"#"}'  target="_blank">
                            SQL</a>
                        </span>
                                                    <span>
                            <a href="https://go.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://go.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://go.csdn.net/","index":"#"}'  target="_blank">
                            Go语言</a>
                        </span>
                                                    <span>
                            <a href="https://r.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://r.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://r.csdn.net/","index":"#"}'  target="_blank">
                            R语言</a>
                        </span>
                                                    <span>
                            <a href="https://assembly.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://assembly.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://assembly.csdn.net/","index":"#"}'  target="_blank">
                            Assembly language</a>
                        </span>
                                                    <span>
                            <a href="https://swift.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://swift.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://swift.csdn.net/","index":"#"}'  target="_blank">
                            Swift</a>
                        </span>
                                                    <span>
                            <a href="https://ruby.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://ruby.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://ruby.csdn.net/","index":"#"}'  target="_blank">
                            Ruby</a>
                        </span>
                                                    <span>
                            <a href="https://matlab.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://matlab.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://matlab.csdn.net/","index":"#"}'  target="_blank">
                            MATLAB</a>
                        </span>
                                                    <span>
                            <a href="https://plsql.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://plsql.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://plsql.csdn.net/","index":"#"}'  target="_blank">
                            PL/SQL</a>
                        </span>
                                                    <span>
                            <a href="https://perl.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://perl.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://perl.csdn.net/","index":"#"}'  target="_blank">
                            Perl</a>
                        </span>
                                                    <span>
                            <a href="https://vb.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://vb.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://vb.csdn.net/","index":"#"}'  target="_blank">
                            Visual Basic</a>
                        </span>
                                                    <span>
                            <a href="https://obj.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://obj.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://obj.csdn.net/","index":"#"}'  target="_blank">
                            Objective-C</a>
                        </span>
                                                    <span>
                            <a href="https://delphi.csdn.net/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://delphi.csdn.net/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://delphi.csdn.net/","index":"#"}'  target="_blank">
                            Delphi/Object Pascal</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/unity/" data-report-click='{"mod":"1586412712_001","ab":"new","dest":"https://www.csdn.net/unity/","index":"索引#"}' data-report-view='{"mod":"1586412712_001","ab":"new","dest":"https://www.csdn.net/unity/","index":"#"}'  target="_blank">
                            Unity3D</a>
                        </span>
                                                
                                                                            <span>
                            <a href="https://www.csdn.net/gather_1d/MtTaUg0sMi1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            c# 不能序列化继承类</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/gather_1f/MtTaUg0sNC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            c# char* 调用</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/gather_18/MtTaUg0sNS1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            c# 开发dll模板</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/gather_13/MtTaUg0sOC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            c#添加控件到工具箱</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/gather_1c/MtTaUg0sOS1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            c#控制台组合数</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/gather_14/MtTaUg1sMS1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            编程计算猴子吃桃问题c#</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/gather_11/MtTaUg1sMy1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            c# wpf 背景透明</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/gather_19/MtTaUg1sNC1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            随机抽取号码软件c#</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/gather_14/MtTaUg1sNi1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            c# 开发环境</a>
                        </span>
                                                    <span>
                            <a href="https://www.csdn.net/gather_15/MtTaUg1sNy1kb3dubG9hZAO0O0OO0O0O.html" target="_blank">
                            c# 属性和字段</a>
                        </span>
                                                                        </div>
                </div>
                </div> -->
                                <div class="recommend-loading-box">
                <img src="https://csdnimg.cn/release/phoenix/images/feedLoading.gif">
            </div>
            <!-- <div class="recommend-end-box">
                <p class="text-center">没有更多推荐了,<a href="https://blog.csdn.net/" class="c-blue c-blue-hover c-blue-focus">返回首页</a></p>
            </div> -->
        </div>
                        <div class="template-box">
                <span>©️2020 CSDN</span>
            <span>皮肤主题: 终极编程指南</span>
            <span> 设计师:
                                        CSDN官方博客                                    </span>
            <span>
                <a href="https://blog.csdn.net/" class="back-home c-blue c-blue-hover c-blue-focus">返回首页</a>
            </span>
            </div>
                    <script src="https://csdnimg.cn/pubfooter/js/publib_footer-1.0.4.js" data-isfootertrack="false" type="text/javascript"></script><div><div class="bottom-pub-footer footer-box pub_fo"><div class="pub-footer-new">    <div id="pub-footerall">        <div class="contact-info">          <a class="right-dotte spec_a" href="//www.csdn.net/company/index.html#about" target="_blank">关于我们</a>          <a href="//www.csdn.net/company/index.html#recruit" target="_blank" class="right-dotte spec_a">招聘</a>          <a href="//www.csdn.net/company/index.html#advertisement" target="_blank" class="right-dotte spec_a">广告服务</a>          <a href="https://www.csdn.net/gather/A" target="_blank" class="footer_baidu right-dotte spec_a">网站地图</a>          <em>          <svg width="16" height="16" xmlns="http://www.w3.org/2000/svg"><path d="M2.167 2h11.666C14.478 2 15 2.576 15 3.286v9.428c0 .71-.522 1.286-1.167 1.286H2.167C1.522 14 1 13.424 1 12.714V3.286C1 2.576 1.522 2 2.167 2zm-.164 3v1L8 10l6-4V5L8 9 2.003 5z" fill="#999AAA" fill-rule="evenodd"></path></svg>          <a href="mailto:webmaster@csdn.net" target="_blank"><span class="txt right-dotte">kefu@csdn.net</span></a><svg t="1538012951761" width="17" height="17" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="23083" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M466.4934485 880.02006511C264.6019863 859.18313878 107.13744214 688.54706608 107.13744214 481.14947309 107.13744214 259.68965394 286.68049114 80.14660493 508.14031029 80.14660493s401.00286817 179.54304901 401.00286814 401.00286816v1.67343191C908.30646249 737.58941724 715.26799489 943.85339507 477.28978337 943.85339507c-31.71423369 0-62.61874229-3.67075386-92.38963569-10.60739903 30.09478346-11.01226158 56.84270313-29.63593923 81.5933008-53.22593095z m-205.13036267-398.87059202a246.77722444 246.77722444 0 0 0 493.5544489 0 30.85052691 30.85052691 0 0 0-61.70105383 0 185.07617062 185.07617062 0 0 1-370.15234125 0 30.85052691 30.85052691 0 0 0-61.70105382 0z" p-id="23084" fill="#999AAA"></path></svg>          <a href="http://bbs.csdn.net/forums/Service" target="_blank"><span class="right-dotte">客服论坛</span></a><svg t="1538013874294" width="17" height="17" style="" viewBox="0 0 1194 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="23784" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M1031.29689505 943.85339507h-863.70679012A71.98456279 71.98456279 0 0 1 95.60554212 871.86883228v-150.85178906c0-28.58329658 16.92325492-54.46750945 43.13135785-65.93861527l227.99160176-99.75813425c10.55341735-4.61543317 18.24580594-14.0082445 20.72896295-25.23643277l23.21211998-105.53417343a71.95757195 71.95757195 0 0 1 70.28414006-56.51881307h236.95255971c33.79252817 0 63.02360485 23.5090192 70.28414004 56.51881307l23.21211997 105.53417343c2.48315701 11.25517912 10.17554562 20.62099961 20.72896296 25.23643277l227.99160177 99.75813425a71.98456279 71.98456279 0 0 1 43.13135783 65.93861527v150.85178906A71.98456279 71.98456279 0 0 1 1031.26990421 943.85339507z m-431.85339506-143.94213475c143.94213474 0 143.94213474-48.34058941 143.94213474-107.96334876s-64.45411922-107.96334877-143.94213474-107.96334877c-79.51500637 0-143.94213474 48.34058941-143.94213475 107.96334877s0 107.96334877 143.94213475 107.96334876zM1103.254467 296.07330247v148.9894213a35.97878598 35.97878598 0 0 1-44.15700966 35.03410667l-143.94213473-33.57660146a36.0057768 36.0057768 0 0 1-27.80056231-35.03410668V296.1002933c-35.97878598-47.98970852-131.95820302-71.98456279-287.91126031-71.98456279S347.53801649 248.11058478 311.53223967 296.1002933v115.385829c0 16.73431906-11.52508749 31.25538946-27.80056233 35.03410668l-143.94213473 33.57660146A35.97878598 35.97878598 0 0 1 95.63253297 445.06272377V296.07330247C162.81272673 152.13116772 330.77670658 80.14660493 599.47049084 80.14660493s436.63077325 71.98456279 503.81096699 215.92669754z" p-id="23785" fill="#999AAA"></path></svg>          <span class="txt right-dotte">400-660-0108</span>          <svg t="1538013544186" width="17" height="17" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="23556" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M902.60033922 650.96445566c-18.0718526-100.84369837-94.08399771-166.87723736-94.08399771-166.87723737 10.87530062-91.53186599-28.94715402-107.78733693-28.94715401-107.78733691C771.20003413 93.08221664 517.34798062 98.02553561 511.98620441 98.16348824 506.65661791 98.02553561 252.75857992 93.08221664 244.43541101 376.29988138c0 0-39.79946279 16.25547094-28.947154 107.78733691 0 0-75.98915247 66.03353901-94.0839977 166.87723737 0 0-9.63372291 170.35365477 86.84146124 20.85850523 0 0 21.70461757 56.79068296 61.50407954 107.78733692 0 0-71.1607951 23.19910867-65.11385185 83.46161052 0 0-2.43717093 67.16015592 151.93232126 62.56172014 0 0 108.5460788-8.0932473 141.10300432-52.14626271H526.33792324c32.57991817 44.05301539 141.10300431 52.1462627 141.10300431 52.14626271 154.3235077 4.59843579 151.95071457-62.56172013 151.95071457-62.56172014 6.00095876-60.26250183-65.11385185-83.46161053-65.11385185-83.46161052 39.77647014-50.99665395 61.4810877-107.78733693 61.4810877-107.78733692 96.45219231 149.49514952 86.84146124-20.85850523 86.84146125-20.85850523" p-id="23557" fill="#999AAA"></path></svg><a href="https://url.cn/5epoHIm?_type=wpa&amp;qidian=true" class="qqcustomer_s" target="_blank"><span class="txt">QQ客服(8:30-22:00)</span></a>          </em>        </div>        <div class="allow-info">          <a href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502030143" rel="noreferrer" target="_blank">公安备案号 11010502030143</a>          <a href="http://beian.miit.gov.cn/publish/query/indexFirst.action" rel="noreferrer" target="_blank">京ICP备19004658号</a>          <a href="https://csdnimg.cn/release/live_fe/culture_license.png" rel="noreferrer" target="_blank">京网文〔2020〕1039-165号</a>          <a href="https://www.csdn.net/company/index.html#statement" target="_blank">版权与免责声明</a>          <a href="https://blog.csdn.net/blogdevteam/article/details/90369522" target="_blank">版权申诉</a>          <a href="http://www.cyberpolice.cn/" target="_blank">网络110报警服务</a>        </div>        <div class="allow-info">          <a href="http://www.12377.cn/" target="_blank">中国互联网举报中心</a>          <a href="https://download.csdn.net/index.php/tutelage/" target="_blank">家长监护</a>          <a href="https://blog.csdn.net/blogdevteam/article/details/90369522" target="_blank">版权申诉</a>          <a href="http://www.bjjubao.org/" target="_blank">北京互联网违法和不良信息举报中心</a>          <a>©1999-2020 北京创新乐知网络技术有限公司</a>        </div>        <div class="bg-gray" style="display:none;">            <div class="feed_copyright">            <p class="fz12_baidu"><img style="display:none;vertical-align: middle;height:20px;margin-right:5px" src="https://csdnimg.cn/pubfooter/images/gongan.png"><a style="margin-right:16px;" href="http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502030143" rel="noreferrer" target="_blank" class="ml14">公安备案号 11010502030143</a> <a href="http://beian.miit.gov.cn/publish/query/indexFirst.action" rel="noreferrer" target="_blank" class="ml14" style="margin-right:16px;">京ICP备19004658号</a><a href="https://csdnimg.cn/release/live_fe/culture_license.png" rel="noreferrer" target="_blank" class="ml14" style="margin-right:16px;">京网文〔2020〕1039-165号</a><a style="margin-right:16px;" href="https://csdnimg.cn/cdn/content-toolbar/csdn-ICP.png" target="_blank">   经营性网站备案信息</a><span class="fz12_baidu">©1999-2020 北京创新乐知网络技术有限公司 </span></p>            </div>        </div>        <div class="allow-info-box" style="display:none;">        <a href="https://www.csdn.net/company/index.html#statement" target="_blank"><span>版权与免责声明</span></a>        <a href="https://blog.csdn.net/blogdevteam/article/details/90369522" target="_blank"><span>版权申诉</span></a>        <a href="https://download.csdn.net/index.php/tutelage/" target="_blank"><span>家长监护</span></a>        <a href="http://www.cyberpolice.cn/" target="_blank"><span>网络110报警服务</span></a>        <a href="http://www.12377.cn/" target="_blank"><span>中国互联网举报中心</span></a>        <a href="http://www.bjjubao.org/" target="_blank"><span>北京互联网违法和不良信息举报中心</span></a>        </div>    </div></div></div></div>
    </main>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis缓存雪崩穿透和击穿是指在使用Redis作为缓存的过程可能会遇到的一些问题。 缓存雪崩是指当缓存大量的数据在同一时间内失效或者缓存服务宕机,导致大量请求直接落到数据库上,从而使得数据库瞬间压力过大,甚至瘫痪的情况。 缓存穿透是指当请求的数据在缓存不存在,且数据库也不存在该数据,这时请求会直接落到数据库上,这会导致大量无效的请求访问数据库,从而使得数据库瞬间压力过大,甚至瘫痪的情况。 缓存击穿是指某个热点key缓存失效的同时,有大量的请求并发地访问这个key,这时候这些请求会直接落到数据库上,从而使得数据库瞬间压力过大,甚至瘫痪的情况。 ### 回答2: Redis缓存雪崩是指在缓存失效的情况下,大量请求同时涌入数据库,造成数据库压力过大的现象。在缓存失效期间,如果有大量请求访问同一数据,这些请求会直接访问数据库,导致数据库无法承受这么大的请求量,进而影响系统的正常运行。 Redis缓存穿透是指恶意请求经过缓存层,直接访问数据库。如果有恶意攻击者发送请求,而这些请求的key并不存在于缓存数据库,每次请求都会直接访问数据库,这将导致数据库负担过重,对系统造成损害。 Redis缓存击穿是指缓存某个key失效的同时,有大量的请求同时访问这个key,请求会直接访问数据库。与缓存雪崩不同的是,缓存击穿是因为某个热点数据的缓存过期,导致大量请求直接访问数据库,而不是所有缓存同时失效。 为了解决缓存雪崩问题,可以采取以下措施:1. 设置缓存过期时间时,可以使用不同的随机值,避免缓存同时失效。2. 使用分布式锁来控制对数据库的并发访问,避免压力集在某个时间段。3. 预加载缓存,提前将热点数据加载到缓存,减少缓存失效的可能性。 为了解决缓存穿透问题,可以采取以下措施:1. 对于不存在的key,在缓存设置一个空值,避免重复的查询数据库。2. 使用布隆过滤器,在缓存层对请求进行过滤,判断key是否存在,避免查询数据库。 为了解决缓存击穿问题,可以采取以下措施:1. 设置热点数据的永不过期,保证它们的缓存一直有效。2. 使用互斥锁,在缓存失效的时候,只允许一个请求访问数据库,其他请求等待结果。3. 使用一级缓存和二级缓存的结构,将热点数据存储在一级缓存,保证其高效访问。 ### 回答3: Redis缓存雪崩是指在某个时间段内,缓存大量数据同时过期或失效,导致大量请求直接打到数据库上,从而引起数据库瞬时压力过大,造成系统性能下降甚至崩溃。 Redis缓存穿透是指恶意请求或非法请求经过缓存层,直接查询数据库获取不到数据,从而导致大量请求落到数据库上,增加数据库压力,造成系统响应缓慢甚至瘫痪。 Redis缓存击穿是指某个热点数据突然失效或被删除,导致大量并发请求同时查询该数据,由于缓存不存在该数据,请求都会直接打到数据库上,造成数据库瞬时压力过大,可能导致系统宕机。 为了解决缓存雪崩问题,可以采取以下措施: 1. 设置缓存失效时间时使用随机值,避免大量缓存同时失效。 2. 使用分布式锁,保证只有一个线程去加载数据到缓存。 3. 设置热点数据永不过期,确保重要数据始终可用。 为了避免缓存穿透,可以采取以下措施: 1. 对请求数据的合法性进行校验,过滤掉非法请求。 2. 对于查询不到的数据,也将空结果缓存一段时间,避免频繁查询数据库。 为了防止缓存击穿,可以采取以下措施: 1. 使用互斥锁,保证只有一个线程去查询数据库,其他线程等待结果。 2. 引入熔断机制,当热点数据失效时,暂时不提供服务,避免大量请求落到数据库上。 3. 针对热点数据设置短期的锁定时间,避免大量请求同时查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值