当前位置: 首页 > news >正文

redis缓存穿透、击穿、雪崩介绍

64f2d72019bd4d10a621914b2867b89c.jpg缓存穿透

 

概念

缓存穿透指某一特定时间批量请求打进来并访问了缓存和数据库都没有的key,此时会直接穿透缓存直达数据库,从而造成数据库瞬时压力倍增导致响应速度下降甚至崩溃的风险;

解决方案

一、通过布隆过滤器解决

原理:将所有需要缓存的key通过hash算法全部放到布隆过滤器将对应下标对应的值置成1,这样当请求进来时先去布隆过滤器里找,发现对应index的key是1则去缓存拿数据为0则直接返回,这样就避免了去数据库查询

 

优缺点:布隆过滤器底层通过redis的bitMap实现是基于位的操作,所以效率高;但是需要提前将key存入过滤器,这大大增加了前置成本;并且key到index的映射通过hash算法,那么必然会出现hash碰撞的问题;

 

二、通过key-null

原理:当请求进来从数据库查询回来的值为空时,将对应的null值也存入redis,这样下次请求时redis里已经有数据了就不会再怼到数据库了

优缺点:思路清晰,操作简单,但是极端情况下会有N多key在数据库和缓存中都没有,那这种实现就造成了redis里有过多的垃圾数据,浪费了内存空间

三、增强前置判断

原理:查询前在接口层做权限、逻辑校验,尽可能多的判断key的合法性

优缺点:使用成本低但并不足以规避掉缓存穿透的风险,所以建议只做附加的解决方案使用

缓存击穿

概念

缓存击穿指某一特定时间批量请求打进来对一个特定的值进行查询并访问了缓存中没有但是数据库里存在的key,此时会直接击穿缓存直达数据库,从而造成数据库瞬时压力倍增导致响应速度下降甚至崩溃的风险;需要注意的是,这里说的缓存中没有包含两层意思,一是缓存中本身没有,二十缓存中有但是过期了(少量热点key过期)

解决方案

一、设置key的过期时间随机

原理:在像redis批量设置key的时候尽量做到过期时间的随机性,以此避免某一时间会有批量key过期导致的缓存击穿

优缺点:虽然解决了缓存中同一时间批量key过期导致的击穿问题但是并不能解决缓存中压根就不存在key而造成的击穿

二、通过分布式锁解决

原理:在查询数据库的时候加一个分布式锁,使得某一特定时间内只有一个请求访问数据库,访问成功后将查询到的值缓存近redis,这样在下次访问时就不会造成击穿的现象了;

需要注意的是,针对非海量请求的业务这里加单机锁也问题不大,无非就是将同一时间只有一个请求到数据改成了同一时间只有集群数量的请求到数据库,问题应该也不大

 

优缺点:无论是缓存中本身就没有还是缓存中的key过期了使用加锁的方式都能解决缓存击穿的问题,但是却增加了加锁的成本

三、设置热点key永不过期

原理:针对热点key批量过期造成的穿透问题,将key设置成永不过期就能解决

优缺点:与一一样只能解决key过期造成的击穿不能解决缓存中没有key造成的击穿,并且热点key的确认也是门学问,并不总能保证设置的热点key不遗漏

四、将key部署在不同的实例

原理:针对集群部署的redis,将热点key分开部署也能避免过期造成的击穿问题

优缺点:只有集群才能使用,且也只能解决key过期造成的击穿问题,并不总能保证设置的热点key不遗漏

缓存雪崩

概念

与击穿相比雪崩表示过期或压根不存在的key是大量而不是一个或少量,导致大量请求落到数据库;

解决方案

一、通过设置过期时间随机来解决

设置key的时候加上随机过期时间,尽量减少同一时间过期key的数量;

二、设置锁

从缓存访问key开始就加锁,当缓存没有则去数据库查,查完塞入缓存最后释放锁;如果是单机应用则直接加虚拟机锁,集群部署的话则需使用分布式锁

http://www.lryc.cn/news/167281.html

相关文章:

  • Redis 基础总结
  • 基于nginx的tomcat负载均衡和集群(超简单)
  • ESIM实战文本匹配
  • 基于虚拟仿真技术的汽车燃油泵控制
  • angular:HtmlElement的子节点有Shadow dom时奇怪的现象
  • 栈与队列--删除字符串中的所有相邻重复项
  • 使用SSH地址拉取远程仓库代码报下面的错误
  • easycms v5.5 分析 | Bugku S3 AWD排位赛
  • 成都营运《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作
  • 创邻科技Galaxybase助力SPG推动知识图谱应用落地
  • 《TCP/IP网络编程》阅读笔记--域名及网络地址
  • 我的C#基础
  • 【UnityShaderLab实现“Billboard“始终面向相机_播放序列图的效果_案例分享(内附源码)】
  • Ceph入门到精通-S3 基准测试工具warp使用入门
  • Docker--未完结
  • string的使用和模拟实现
  • 基础算法---区间合并
  • C++(day4)
  • docker 部署 node.js(express) 服务
  • 商城系统开发,如何确保用户数据的安全性?
  • 黑客必备工具Kali Linux,安装与使用教程全包含,从入门到精通,全网最详细全面的Kali Linux教程
  • 2024滴滴校招面试真题汇总及其讲解(二)
  • 嵌入式-C语言中的if语句
  • 组合数 rust解法
  • 【SpringMVC】自定义注解与AOP结合使用
  • MyEclipse 用tomcat部署SSM项目后,项目名称和当前项目不一致
  • 来喽!!炒鸡详细的“数据在内存中的存储”真的来喽!
  • 【面试经典150 | 双指针】验证回文串
  • sql存储引擎
  • Visual Studio 2022安装SVN插件教程