Redis 缓存技术虽能显著提升读写性能,但面临穿透、击穿、雪崩三大局限性。解决穿透需采用布隆过滤器前置校验及空值短期缓存策略;应对雪崩则需设置随机 TTL 避免集体失效或采用逻辑永不过期方案。数据一致性挑战方面,可通过双写一致策略、延时双删或借助 Canal 监听 binlog 实现最终一致性。核心在于多层防御与异步协调,确保数据库不被高并发流量压垮,同时维持缓存与存储层的数据同步。
双十一零点崩溃?三招拆解 Redis 缓存连环雷
Redis 缓存有三道经典裂缝:穿透、击穿、雪崩。名字像玄学,实则是可复现、可防御的工程问题。本文用一张图串起三者逻辑,再逐层拆解代码级解决方案。一图定位:你在哪条裂缝上翻车 穿透、击穿、雪崩常被混为一谈,但触发条件和防御策略完全不同。穿透是"查不存在的东西"——缓存没记录,数据库也没有,请求白跑一趟还拖垮 DB。典型场景:黑产用脚本遍历 user:13800000001 到 user:13800999999,每秒上万次无效查询。击穿是"热点 Key 刚好过期"——某个超高频访问的 Key(比如首页推荐位 hot_item) 在失效瞬间,上千线程同时穿透缓存,争抢重建,数据库 CPU 直接打满。雪崩是"集体过期引发洪峰"——大量 Key 被设置相同 TTL,凌晨 2 点整同时失效,流量像决堤一样同步涌向数据库。三者的破坏力呈递进关系:穿透是点状骚扰,击穿是单点爆破,雪崩则是系统性塌方。
双十一零点崩了?Redis 三兄弟在搞事
防御代码原文贴得很实。第一层用布隆过滤器做存在性前置校验,「快速拦截绝对不存在的 key」;第二层查缓存;第三层才是数据库。如果数据库返回空,「空值缓存 5 分钟」——这是关键,让后续的重复攻击撞在缓存墙上,而不是反复穿透。核心就两点:存在性前置校验 + 空值短期缓存。把无效流量挡在数据库门外。击穿:热点 Key 过期的那一毫秒 比穿透更隐蔽,因为它发生在"正常业务"里。原文的复现场景很画面感:「GET hot_item 返回 nil 的刹那,1000 个线程同时执行 SET」。首页推荐位、爆款商品详情页,这种超高频 Key 一旦过期,瞬间的并发重建能把数据库 CPU 打满。解法是用分布式锁把重建动作串行化。Redis 的 SETNX(SET if Not eXists,仅在键不存在时设置值) 命令,配合自动过期时间,实现"谁抢到锁谁重建,其他人等着"。
Redis 中,什么是缓存击穿、缓存穿透、缓存雪崩
2、什么是缓存?缓存 (cache),原始意义是指访问速度比一般随机存取存储器 (RAM) 快的一种高速存储器,通常它不像系统主存那样使用 DRAM 技术,而使用昂贵但较快速的 SRAM 技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。比如我们的 redis、他就是缓存中比较常见的一种,他的并发读写能力能达到 10w/s 左右的速度,这个速度是相当不错的,相对于传统的数据存储来说,比如数据库,快了不知道多少倍,传统的数据库 (mysql) 操作的都是磁盘,而 redis 操作的是内存 (ram),所以他们的速度肯定是没法比较的,由于传统数据库的读写较慢,所以并发较高的时候就会造成性能瓶颈问题,这也是为什么需要引入缓存的原因之一。再唠一下~ 缓存的出现,同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那么就不能使用缓存。另外的一些典型问题就是,缓存穿透、缓存雪崩和缓存击穿。
Redis 常见面试题 (一):Redis 使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis 持久化,数据过期策略,数据淘汰策略
一、Redis 使用场景 如果发生了缓存穿透、击穿、雪崩,该如何解决?二、缓存穿透 缓存穿透:查询一个不存在的数据,mysql 查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库 解决方案一:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存。{key:1, value:null} 优点:简单 缺点:消耗内存,可能会发生不一致的问题 解决方案二:布隆过滤器 优点:内存占用较少,没有多余 key 缺点:实现复杂,存在误判 布隆过滤器 bitmap(位图):相当于是一个以**(bit) 位为单位的数组,数组中每个单元只能存储二进制数 0 或 1** 布隆过滤器作用:布隆过滤器可以用于检索一个元素是否在一个集合中。总结 1.Redis 的使用场景 根据自己简历上的业务进行回答 缓存——穿透、击穿、雪崩、双写一致、持久化、数据过期、淘汰策略 分布式锁——setnx、redisson 2.什么是缓存穿透,怎么解决 缓存穿透:查询一个不存在的数据,mysql 查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库,可能导致 DB 挂掉,这种情况大概率是遭到了攻击 解决方案一:缓存空数据 解决方案二:布隆过滤器
避免缓存失效的三大杀手:缓存击穿、穿透与雪崩的解决方案
在使用 Redis 作为缓存时,我们常常会遇到缓存击穿、缓存穿透和缓存雪崩等问题。本文将介绍这些问题的概念、原因以及如何避免和解决。缓存击穿 缓存击穿是指在缓存中不存在但数据库中存在的数据,在高并发情况下,大量请求同时访问这个不存在的缓存,导致这些请求都穿过缓存直接访问数据库,增加数据库的压力。造成缓存击穿的原因主要有以下几点:热点数据失效:热点数据突然失效,导致大量请求访问同一条数据。并发访问:大量并发请求同时访问缓存,导致缓存无法及时更新。缓存穿透 缓存穿透是指查询一个不存在的数据,由于缓存和数据库中都没有这个数据,导致大量请求都直接访问数据库,增加数据库的压力。造成缓存穿透的原因主要有以下几点:恶意攻击:恶意用户通过构造不存在的数据来攻击系统。大量查询:查询量过大,导致查询的数据大部分都不存在。缓存雪崩 缓存雪崩是指缓存中大量的数据同时失效,导致大量请求直接访问数据库,增加数据库的压力,甚至导致数据库宕机。造成缓存雪崩的原因主要有以下几点:相同的失效时间:大量缓存数据设置相同的失效时间,导致同时失效。服务器宕机:缓存服务器宕机或网络故障,导致缓存失效。
FAQ
什么是缓存穿透?
缓存穿透是指查询一个不存在的数据,由于缓存和数据库中都没有这个数据,导致大量请求都直接访问数据库,增加数据库的压力。造成缓存穿透的原因主要有恶意攻击或大量查询不存在的数据。
如何解决缓存雪崩?
为缓存数据设置随机的过期时间,避免同时失效。使用热点数据预热策略,提前加载热点数据到缓存中,减少缓存失效的可能性。还可以采用逻辑永不过期方案,靠后台任务异步刷新。
缓存击穿的原因是什么?
热点数据失效导致大量请求访问同一条数据,或大量并发请求同时访问缓存,导致缓存无法及时更新。当热点 Key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。