缓存击穿/穿透/雪崩

Intro

使用缓存需要了解几个缓存问题,缓存击穿、缓存穿透以及缓存雪崩,需要了解它们产生的原因以及怎么避免,尤其是当你打算设计自己的缓存框架的时候需要考虑如何处理这些问题。

缓存击穿

一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的 value ,就应该去后端系统查找(比如数据库)。如果 key 对应的 value 是一定不存在的,并且对该 key 并发请求量很大,就会对后端系统就会造成很大的压力。

在高并发下,多线程同时查询同一个资源,如果缓存中没有这个资源,那么这些线程都会去后端服务或数据库查找,对数据库造成极大压力,缓存也就失去存在的意义。

缓存击穿解决方案

导致缓存击穿的问题在于高并发多线程情景下,许多请求一下子都到后端服务和数据库,导致后端服务与数据库的压力骤增。

处理这个问题,在多线程请求同一个 key 的时候,进行排队,这样第一次请求后端服务和数据库之后更新缓存的值,下一个请求从缓存中取数据的时候就会拿到缓存数据,不会再请求后端服务和数据库。

缓存穿透

缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询,从而失去了缓存的意义而且相比直接查询数据库还增加了每次都去查缓存。

缓存穿透解决方案

导致问题出现的原因在于请求一个不存在的数据从而使得缓存始终不存在进而导致后端系统(主要是数据库)要承受很大的压力,所以想要解决这个问题,就势必就在缓存这里拦截住大量的请求,使得最终走到后端系统,查询数据库的请求尽可能的少。

一般处理这个问题,缓存不存在的时候会在缓存中设置一个时间较短的内容为空的缓存,从而减少实际请求到后端和进行数据库查询的次数。

复杂一些的解决方案有 布隆过滤器,基本原理是设置一个 list,查询缓存的时候从 list 里进行判断,这里不做多介绍。

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。

缓存雪崩

当缓存服务器重启或者大量缓存集中在某一个时间失效,这样在失效的时候,也会给后端系统和数据库带来很大压力.

缓存雪崩解决方案

导致出现缓存雪崩的根本原因在于缓存大量失效,从而导致大量请求没有命中缓存,大量请求走到后端服务和数据库,造成压力。

如果系统启动就依赖很多缓存,那可以通过其它服务进行缓存预热,提前把需要的数据放到缓存中,避免系统启动大量请求直接请求到后端服务和数据库。

既然是由于同一时间缓存大量失效,我们也可以着手从缓存的失效时间上,做一些优化,让缓存不要在同一时间点失效。具体的实施办法,你可以在设置失效时间的时候随机加几秒过期时间,避免同一时间点缓存大量失效。

Reference

  • https://github.com/WeihanLi/WeihanLi.Redis/issues/2

  • https://www.cnblogs.com/jinjiangongzuoshi/archive/2016/03/03/5240280.html

  • https://blog.csdn.net/zeb_perfect/article/details/54135506

  • https://blog.csdn.net/bushanyantanzhe/article/details/79459095

  • https://baike.baidu.com/item/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8/5384697?fr=aladdin

Contact

Contact me: weihanli@outlook.com

缓存击穿/穿透/雪崩相关推荐

  1. 你需要知道的缓存击穿/穿透/雪崩

    目录 缓存击穿/穿透/雪崩 Intro 缓存击穿 缓存穿透 缓存雪崩 Reference Contact 缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿.缓存穿透以及缓存雪崩 ...

  2. redis——缓存击穿/穿透/雪崩

    缓存穿透 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就去后端系统查找(比如DB). 一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力.这就叫 ...

  3. 面试常问:redis缓存击穿/穿透/雪崩

    1. 讲个故事 一个人去门店买联想电脑,线下门店没有货了,于是店员给厂家打电话问问有没有货,厂家发现也没货了,这个人就走了.过了一会另一个人也要来买联想电脑,然后店员又打电话问了一次厂家,如此反复.这 ...

  4. Redis数据读取(缓存击穿,穿透,雪崩)

    内容文件参考"付费专栏"可领取.专栏购买者提供本内容"永久答疑和远程协助"服务.一诺千金! N.1 缓存处理流程 1)前台请求,后台先从缓存中取数据,取到直接返 ...

  5. 【redis】redis缓存穿透及解决方案|缓存穿透,缓存击穿,雪崩的理解

    |目录 缓存穿透 解决方案 布隆过滤 缓存空对象 缓存雪崩 解决方案 1.保证缓存层服务高可用性 2.依赖隔离组件为后端限流并降级 3.数据预热 4.做二级缓存,或者双缓存策略. 5.缓存永远不过期 ...

  6. 【redis】缓存击穿、雪崩、穿透

    缓存穿透 简介 key对应的数据在数据库和缓存中都不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,所以当有特别多key不存在的请求到来时,会直接访问数据库,数据库扛不住压力,从而可能压 ...

  7. Redis缓存击穿、雪崩、穿透!(超详细)

    缓存的击穿.穿透和雪崩应该是再熟悉不过的词了,也是面试常问的高频试题. 不过,对于这三大缓存的问题,有很多人背过了解决方案,却少有人能把思路给理清的. 而且,网络上仍然充斥着,大量不太靠谱的解决方案, ...

  8. Redis学习 - NoSQL简介、redis安装、redis基础知识、数据类型、持久化、订阅发布、主从复制、哨兵模式、缓存击穿和雪崩

    学习视频地址:https://www.bilibili.com/video/BV1S54y1R7SB 完结撒花,感谢狂神 文章目录 1. NoSQL 1.1 单机Mysql的演进 1.2 当今企业架构 ...

  9. 缓存击穿和雪崩常用解决方案

    目录 1 抢红包排行查询 2 击穿现象分析 3 击穿解决方案 3.1 定时器 3.2 多级缓存 3.3 分布式锁 3.4 队列术 4 缓存雪崩介绍 1 抢红包排行查询 上面案例我们实现了某个用户抢红包 ...

最新文章

  1. 关于Linux中文件权限的探究
  2. python手机版打了代码运行不了-android手机安装python并写代码运行
  3. HDU 1251 统计难题 字典树/STL
  4. 4.1_ 1_ 初识文件管理
  5. 卸载KVM虚拟机(全、干净、彻底)
  6. Android launcher 壁纸 wallpaper
  7. 网页设计中最常用的字体
  8. X9C102PIZ数字电位器-中文
  9. python操作word实现小学拼音本功能
  10. Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(3):寻找正确的代码版本
  11. AVKit  做一个页面类似于B站的视频页面 (第一种做法)
  12. 免费H5页面制作工具大汇总
  13. 码距与检错或纠错能力的关系
  14. element-ui el-table 表格渲染错位以及高度计算错误问题
  15. 【java小游戏】老虎杠子鸡游戏
  16. 混淆矩阵评价指标_分类效果评价指标一混淆矩阵
  17. Eclipse的乱码问题是如何解决的
  18. 怎么使用ArcScene进行洪水淹没分析
  19. 微信下载手机版下载方式详解
  20. unity学习——遮挡剔除

热门文章

  1. 博客园2013年5月份第1周源码发布详情
  2. 股市红涨绿跌色系定义真的是中国特色吗?
  3. python3 tkinter电子书_Python3 Tkinter-Text
  4. 从Boxee的Amie Street访问音乐
  5. linux rmp命令安装包在哪里_rpm命令_Linux rpm 命令用法详解:RPM软件包的管理工具...
  6. chrome开启touch屏幕点击事件
  7. Android 4 +https(如何启动TLS1 1 and TLS1 2)
  8. win 7 旗舰版镜像 注入USB3.0 驱动
  9. document.elementFromPoint
  10. ABP vNext微服务架构详细教程——分布式权限框架(上)