Redis中几个“看似”高大上的概念,经常有人提到,某些好事者喜欢死扣概念,实战没多少,嘴巴里冒出来的全是高大上的名词,个人一向鄙视概念党,呵呵!

其实这几个概念:缓存穿透/缓存击穿/缓存雪崩,有一个共通的相似之处,就是高并发下,某些原因导致缓存层失去了保护,导致后端的持久化层(数据库)承担较大压力的情形。
需要注意的是,这些问题发生的前提,需要有足够大的并发性,如果本身并发性不高,那些即便出现了这些个问题,也不会造成非常大的影响。
甚至极端地讲,只要代码的健壮性足够,即便是缓存层全部宕机,也不会导致整个应用程序的崩溃,只不过是所有的请求都指向后端的持久化数据库层罢了。
试问,排出一些低级的问题包括方案,君见过多少请求压垮数据库的场景,或者数据缓存流行之前应用程序就应付不了高并发?
使用缓存,更多的进一步改善性能或者并发,而不是因为数据库被压垮了才使用缓存。

缓存穿透
缓存穿透本质上是查询一个缓存和数据库中都不存在的key值,Redis的缓存层无法命中,导致请求再次指向执行数据库层的情况。
由于是查询到值不存在(当然也不存在与Redis缓存中),导致请求总是“穿透”Redis发往数据库层,因此缓存层失去了“保护”关系数据库层的意义。
解决方案:
布隆过滤器是一个比较好的选择,参考:https://www.cnblogs.com/wy123/p/11571215.html

缓存击穿
强调对于某些热点key,缓存穿透本质上是高并发地请求一个缓存中不存在,但是数据库中存在的key值,导致并发请求指向数据库,导致数据库端承担大量的请求压力的情况,本质上跟缓存穿透一样。
主要侧重的是并发&&“热点”Key不存在与缓存中,导致请求指向数据库层。
解决方案:
这种场景可以从代码逻辑层面优化,从缓存中查询不到数据,再次将请求转向数据库中的时候,锁定该key,获取到该key之后,将该key写入缓存,伪代码如下

value = get_value_from_redis(key1)
if not value:
if exclusiveness_lock(key1):#成功排他性锁定目标,请求指向数据库
value = get_value_from_mysql(key1)
  if value:
  write_key_to_redis(key1,value)
else:#无法获取排他性锁,间隔0.1s之后再次查询缓存
time.sleep(0.1)
# 再次从缓存中查询
get_value_from_redis(key1)

缓存雪崩
某些原因,比如:
1,Redis实例(主从,集群,哨兵等等)故障。
2,Redis中的key由于过期时间已到,自动过期。
3,由于Redis内存策略导致(maxmemory,maxmemory-policy配置)某些key失效(过期,被清理出缓存等)。
如果此时出现高并发的请求出现,这些请求会全部指向数据库层,缓存层失去了对数据库层的保护,导致数据库承担绝大压力的情况。
解决方案:
1,Redis层的高可用,保证缓存层可以有效地保护数据库层
2,从Redis配置(内存管理策略maxmemory,maxmemory-policy)以及结合业务,避免某些潜在的热点key值过期
3,应用程序端限流,或者通过队列的方式等削峰的方式来保护后端数据库

Redis中几个简单的概念:缓存穿透/击穿/雪崩,别再被吓唬了的更多相关文章

  1. NoSQL & Redis 介绍、缓存穿透 & 击穿 & 雪崩

    1. NoSql 简介 2. Redis 简介 2.1 Redis 的起源 2.2 缓存过期 & 缓存淘汰 3. 缓存异常 1)缓存穿透 2)缓存击穿 3)缓存雪崩 4)总结 1. NoSQL ...

  2. 缓存穿透、雪崩、热点与Redis

    (拼多多问:Redis雪崩解决办法) 导读:互联网系统中不可避免要大量用到缓存,在缓存的使用过程中,架构师需要注意哪些问题?本文以 Redis 为例,详细探讨了最关键的 3 个问题. 一.缓存穿透预防 ...

  3. Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩

    本篇博客我们来介绍Redis使用过程中需要注意的三种问题:缓存穿透.缓存击穿.缓存雪崩. 1.缓存穿透 一.概念 缓存穿透:缓存和数据库中都没有的数据,可用户还是源源不断的发起请求,导致每次请求都会到 ...

  4. Redis系列(八)--缓存穿透、雪崩、更新策略

    1.缓存更新策略 1.LRU/LFU/FIFO算法剔除:例如maxmemory-policy 2.超时剔除,过期时间expire,对于一些用户可以容忍延时更新的数据,例如文章简介内容改了几个字 3.主 ...

  5. Redis(1.8)Redis与mysql的数据库同步(缓存穿透与缓存雪崩)

    [1]缓存穿透与缓存雪崩 [1.1]缓存和数据库间数据一致性问题 分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的 ...

  6. Redis缓存穿透和雪崩

    缓存穿透 用户想要查询一个数据 在redis缓存数据库中没有获取到 就会向后端的数据库中查询. 当用户很多 都去访问后端数据库的话,这就会给数据库带来很大的压力. 常见场景:秒杀活动 等 解决方法: ...

  7. 《Redis - 穿透/击穿/雪崩/集中失效》

    一:什么是缓存穿透? - 定义 - 正常情况下,我们在理想的条件下去查询缓存数据都是存在的. - 那么请求去查询一条数据库中不存在的数据,也就是缓存和数据库都查询不到这条数据. - 所以请求每次都会打 ...

  8. Redis 穿透 & 击穿 & 雪崩

    原文:https://www.cnblogs.com/binghe001/p/13661381.html 缓存穿透 如果在请求数据时,在缓存层和数据库层都没有找到符合条件的数据,也就是说,在缓存层和数 ...

  9. 深入了解Redis(7)-缓存穿透,雪崩,击穿

    redis作为一个内存数据库,在生产环境中使用会遇到许多问题,特别是像电商系统用来存储热点数据,容易出现缓存穿透,雪崩,击穿等问题.所以实际运用中需要做好前期处理工作. 一.缓存雪崩 1.概念 缓存雪 ...

随机推荐

  1. Selenium WebDriver 中鼠标事件

    鼠标点击操作  鼠标点击事件有以下几种类型:  清单 1. 鼠标左键点击   Actions action = new Actions(driver);action.click();// 鼠标左键在当 ...

  2. day20190904一号店网页HTML+CSS

    1.知识要理一理.梳理.当天讲了什么内容?当天我学习到了什么内容?看懂.所有的学习型从模仿开始.1.看懂代码,看懂思路,学思路,多问自己问题,为什么要这么写?下一步为什么要这么写?因 果.2.多练多敲 ...

  3. P1046 陶陶摘苹果

    题目描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出1010个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个3030厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 现在 ...

  4. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

  5. 行内元素(inline标签)设置了行高为什么不生效,还是表现为父盒子的行高?行内元素行高问题终极解释

    最近在看张鑫旭大佬的<css世界>,读到5.2.4  内联元素 line-height 的“大值特性” ,产生了疑惑, 在开发中确实也遇到了同样的问题,深入探究后得出结果,先说结论吧,论证 ...

  6. Chapter 02—Creating a dataset(Part1)

    一. 数据集 1. 在R语言中,进行数据分析的第一步是创建一个包含待研究数据并且符合要求的数据集. · 选择装数据的数据结构 · 把数据装入数据结构中 2. 理解数据集 (1)数据集通常是矩形的数据列 ...

  7. Apache和PHP结合、Apache默认虚拟主机

    5月28日任务 课程内容: 11.14/11.15 Apache和PHP结合11.16/11.17 Apache默认虚拟主机 11.14/11.15 Apache和PHP结合 到目前为止虽然安装好了A ...

  8. python_爬虫

    1.网络爬虫    1.定义:网络蜘蛛,网络机器人,抓取网络数据的程序    2.总结:用Python程序去模仿人去访问网站,模仿的越逼真越好    3.目的:通过有效的大量的数据分析市场走势,公司的 ...

  9. shell脚本sed awk

    删除第一行 sed '1d' test.txt 假装执行 sed -i '1d' test.txt 执行 从第二行删除到行尾 sed '2,$d' test.txt sed -i '2,$d' tes ...

  10. js4——字符转化

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...