目录

  • 缓存击穿/穿透/雪崩

    • Intro
    • 缓存击穿
    • 缓存穿透
    • 缓存雪崩
    • Reference
    • Contact

缓存击穿/穿透/雪崩

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

  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. 计算机word应用模块三,计算机应用基模块三.ppt
  2. 自定义View 实现软键盘实现搜索
  3. Linux编程简介——动态链接库
  4. tomcat指定配置文件路径方法
  5. 利用JavaScript选择GridView行
  6. Java对象内存图二
  7. C++ opengl 方向光
  8. 信息学奥赛一本通 1175:除以13 | OpenJudge NOI 1.13 27:除以13
  9. bootstrap table中文文档_用Python完成一件小事:自动生成文档报告
  10. 我的教师生涯4:被忘却的第一节课
  11. Php把ts转为mp4,ts文件转换为mp4文件软件电脑版下载
  12. 概率论 —— 条件数学期望
  13. 学游戏设计好就业吗?有“钱”途吗?
  14. 禅道-使用禅道来进行项目任务管理
  15. 介绍篇 决策引擎环节
  16. C# 获取汉字的对应的全拼音和拼音首字母(含源码)
  17. Yocto中开发内核的两种方法
  18. Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能
  19. Linux 系统下各种包的安装方法
  20. 荷兰高性能输出服务器,荷兰服务器国内访问慢,怎么加速?

热门文章

  1. os-cocos2d游戏开发基础-进度条-开发笔记
  2. java实现简单的约瑟夫环问题(二)
  3. THINKPAD笔记本Fn组合键介绍
  4. 数据结构与算法-学习笔记(13)
  5. IOT物联网观察之三大运营商物联网发展进入规模商用阶段
  6. Maven本地缓存清理小工具
  7. 3D滚动下拉菜单-简直不要太任性
  8. Linux主机驱动与外设驱动分离思想
  9. 使用Intel VTune性能分析器分析.NET模块运行时间
  10. 版本管理 - Git 使用入门