黑马点评-Redis的缓存击穿,缓存雪崩,缓存穿透,互斥锁,逻辑过期

47 篇文章 0 订阅
22 篇文章 0 订阅

1.缓存穿透

在这里插入图片描述

解决办法
在这里插入图片描述

写入NULL值到Redis缓存,以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题!
代码
在这里插入图片描述
在这里插入图片描述

2.缓存雪崩

这个概念很好理解,雪崩就是无数的小雪花结构突然因为外界传递的巨大能量而受到破坏,因此无数雪花结构崩溃导致雪崩,这里缓存里面的key也是一样的,大量的key同时失效导致大量请求打到数据库,导致数据库崩溃!

在这里插入图片描述

3.缓存击穿

在这里插入图片描述

在这里插入图片描述

3.1 互斥锁

利用到了Redis的setnx指令,这种指令设置的key是只有该key不存在时才会被修改成功,如果该key已经存在,则无法修改该key。利用该特性,如果大量的线程来到获取该key并修改该key为1,那么实际上只有1个key才会被修改成功,并且java中提供了相应的函数提供此功能,如果修改成功,那么返回True,如果修改失败,那么返回false,根据此特性,如果我们使用该函数如果返回False那就是获取互斥锁失败,如果True那就是获取互斥锁成功!接着我们可以直接使其他所有的相关线程Sleep就完事儿了,等到获取互斥锁成功的线程执行完重构缓存的命令完了之后再来访问!原来成功获取锁的线程就直接返回旧的缓存数据即可!这个就是互斥锁原理!
在这里插入图片描述

3.2 基于逻辑过期

逻辑过期的应用场景是对于热点Key的访问,比如商家做活动的时候,系统里面有经常访问到的key,这种key就是热点key。
在这里插入图片描述
逻辑过期给出的解决方案:
在逻辑过期的解决方案里面,热点key的缓存的TTL都是直接设置为-1的,即永久保存在Redis中,但是这样我们如何区分这些个热点key有无过期呢?于是我们设置了expire字段,标记他有无过期,如果当前时间在这个expire之前,那么就是该热点key没过期,直接去做缓存重建,重置热点key的expire(在原来expire过期时间上再次加上30分钟),如果过期了,那就直接返回旧的缓存数据,获取锁完成缓存重建,用线程池里面的线程完成缓存重建!这样无论如何都能保证到热点key永不过期,永远不会说是热点key过期了的瞬间又瞬间来了大量的请求打到后台数据库导致数据库宕机!
一般来说在这套流程里面,缓存都是命中的,如果没命中,只能说明这个key不是热点key,中了就是热点key。因为我们的Redis都是提前缓存好了许多的热点key的,热点key才会命中,冷门key就没命中,因为冷门key不在Redis里面。在这里插入图片描述

在这里插入图片描述

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿维的博客日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值