Redis-雪崩,穿透,击穿,无底洞

雪崩

何为雪崩?

缓存层由于某些原因(大量缓存集中在某一个时间段失效缓存宕机)不能提供服务,于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会级联宕机的情况。

雪崩原因?

  1. 大量缓存集中在某一个时间段失效。
  2. 缓存服务宕机。

雪崩后果?

存储层调用量暴增,可能会造成存储层级联宕机。

如何解决?

  1. 保证缓存层服务高可用性(Redis Sentinel,Redis Cluster)
  2. 依赖隔离组件为后端限流并降级
  3. 提前演练
    演练缓存层宕掉后,应用以及后端的负 载情况以及可能出现的问题,在此基础上做一些预案设定。
  4. 缓存失效时间分散开(失效时间基础上加随机数),或者永不过期

穿透

何为穿透?

缓存穿透是指查询一个根本不存在的数据。一般是:
缓存层不命中 ==>存储层不命中,不将空结果写回缓存==>返回空结果。
不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义

穿透后果?

使后端存储负载加大,甚至GG。

穿透原因?

  1. 自身业务代码或者数据出现问题。(粗暴点说,你每次返回uid的时候都在后年拼接上“qqq”,那业务方每次用uid获取用户信息肯定找不到数据。)
  2. 恶意攻击、爬虫。(有人搞事情)

如何解决?

  1. 缓存空对象(存储层不命中后,仍然将空对象保留到缓存层中)
    1.1问题:需要更多的内存空间
    空值做了缓存,意味着缓存层中存了更多的键,需要更多的内存空间(如果是攻击,问题那就严重了,一会给你写满了),一般针对这种情况我们的会针对这类数据设置一个较短的过期时间,让其自动剔除
    1.2 问题:缓存层和存储层数据的不一致
    你这边缓存完了,完事存储层把数据加上了,就有一个数据不一致的窗口期。数据更改时主动删除相应缓存
  2. 布隆过滤器
    有兴趣可以自己去研究就下这东西。个人觉着,一般咱们的业务用上边那个。
    2.1适用于数据命中不高、数据相对固定、实时性低(通常是数据集较大)的应用场景,代码维护较为复杂,但是缓存空间占用少。

击穿

何为击穿?

某条缓存数据失效的瞬间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃。

击穿原因?

1.当前key是一个热点key(例如一个热门的娱乐新闻),并发量非常大。
2.重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的 SQL、多次IO、多个依赖等。

击穿后果?

存储端负载加大,甚至可能会让其崩溃。

如何解决?

  1. 互斥锁
    只允许一个线程重建缓存,其他线程等待重建缓存的线程执行 完,重新从缓存获取数据即可。
    优:思路简单。较好地降低后端存储负载。一致性上做得 比较好。
    缺:死锁或者线程阻塞如果构建缓存过程出现问题或者时间较长,可能会存在死锁和线程池阻塞的风险。
  2. 热点数据永不过期
    2.1 不设置过期时间
    2.2 (定时刷新)为每个value设置一个逻辑过期时间,当发现超过逻 辑过期时间后,会使用单独的线程去构建缓存。
    优:用不过期,不存在热点KEY导致的问题。
    缺:代码复杂,实现困难。存在数据不一样的情况。

无底洞(这玩意说的是在集群里)

何为无底洞?

缓存的结点已经很多了。这时候你在增加新的缓存结点。发现性能不但没有好转反而下降了。

无底洞原因?

  1. 批量操作涉及的网络操作次数变多。
    键值数据库由于通常采用哈希函数将 key映射到各个节点上。添加大量节点做水平扩容,导致键值分布到更多的节点上。而批量操作通常需要从不同节点上获取。例如一次mget操作需要访问多个Redis节点, 需要多次网络时间。
  2. 网络连接数变多,对节点的性能也有一定影响。

如何解决?

  1. 常见的IO优化思路:
    1.1 命令本身的优化,例如优化SQL语句。
    1.2 减少网络通信次数。
    1.3 降低接入成本,例如客户端使用长连/连接池、NIO等。
  2. 减少网络通信次数(批量操作解决方案):
    2.1串行命令:客户端n次get:n次网络+n次get命令本身。
    Redis Cluster:无法使用mget命令一次性获取。
    优:实现起来比较简单。
    缺:时间复杂度较高。大量keys超时严重。
    2.2串行IO:node次网络时间+n次命令时间。
    Redis Cluster:使用CRC16算法计算出散列值,再取对16383的余数就可以算出slot值。
    Redis Cluster:Smart客户端会保存slot和节点的对应关系。
    优:实现起来比较简单。
    缺:时间复杂度较高。大量nodes也会超时严重。
    可以得到得到每个节点的key子列表,然后分别对每个结点执行批量操作。
    2.3并行IO
    将方案2中的最后一步改为多线程执行,网络次数虽然还是节点个数,但由于使用多线程网络时间变为O(1)。
    优:利用编程特性,时间取决于最慢的线程。
    缺:增加编程复杂度。多线程并发,出现问题定位也会比较难。
    2.4hash_tag实现:1次网络时间+n次命令时间
    Redis Cluster:的hash_tag功能,它可以将多个key强制分配到一个节点上。
    优:性能较好。
    缺:业务维护成本高。容易出现数据倾斜。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容