博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
缓存击穿、缓存穿透、缓存雪崩的定义和解决方案
阅读量:3936 次
发布时间:2019-05-23

本文共 780 字,大约阅读时间需要 2 分钟。

笔者这段时间复习了一下缓存异常的几个概念和解决办法,在这里记录一下

目录


一、缓存击穿

1、概念

击穿其实就是某个高访问量的缓存数据,它的缓存过期时间到了,这个时候仍旧有大量对这个数据的请求发送过来,当这些请求发现缓存中没有对应数据的时候就直接去访问数据库了,这一瞬间可能就会对数据库造成巨大的压力,可能会把数据库压垮(也就是直接放弃一部分请求)

2、解决办法

使用互斥锁。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。

二、缓存穿透

1、概念

穿透就是去查询一个数据库中原本就不存在的数据,这个时候由于数据库里面没有对应的数据,缓存里面当然也不会有,此时该查询就穿透了缓存直接访问数据库了

2、解决办法

  • 1、采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
  • 2、如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

三、缓存雪崩

1、概念

雪崩就是大量的缓存在同一个时间过期,然后巨量的访问请求直接从数据库中查询数据,给数据库带来巨大的压力

2、解决办法

  • 1、对每个缓存设置不同的缓存时间(这个能有效的防止大量缓存同时过期);
  • 2、使用分布式锁(Redission中的lock),缓存失效时锁住之后发送过来的第一个请求,等待其执行完再次把新的缓存数据放入缓存之后再释放锁,给后面的请求放行;
  • 3、使用二级缓存

转载地址:http://wktgn.baihongyu.com/

你可能感兴趣的文章
数据挖掘(Data Mining)和数据分析(Data Analysis)的对比
查看>>
[敏捷开发实践] 敏捷团队如何应对Product Owner不断变化的需求
查看>>
[敏捷开发实践] 为什么开发人员不愿意写单元测试?
查看>>
[敏捷开发实践] 端到端测试你了解多少?
查看>>
API 测试你所需要知道的……
查看>>
[哪些年玩 Spring Boot 时踩过的坑] application.yml 文件格式错误引发的错误信息
查看>>
质量保证的新方法:TestOps 概念、原则、方法
查看>>
谈谈端到端测试(End-to-End Testing)
查看>>
DevOps对于测试团队意味着什么?
查看>>
pip 命名备忘录
查看>>
解读 Flaky Test
查看>>
测试计划模板——Test Plan(中英文)
查看>>
测试策略模板——Test Strategy(中英文)
查看>>
赢得面试——关于敏捷测试谈谈你的认识(Agile Testing)
查看>>
DevOps 工程师面试问题(持续更新)
查看>>
赢得面试——关于敏捷方法论和敏捷开发你所需要知道的
查看>>
赢得面试——性能测试你所需要知道的
查看>>
赢得面试——什么是 Spike Testing?
查看>>
Selenium 不同版本的区别
查看>>
解读TMMi测试能力成熟度模型
查看>>