# 聊聊 Redis 的缓存穿透、缓存击穿、缓存雪崩

Redis 的缓存相关内容,面试的时候可是经常遇到的,今天总结一下,这方面的知识

# 缓存穿透

# 什么是缓存穿透

👀缓存穿透就是大量的请求 key 在缓存中不存在,直接落到了数据库上。比如攻击者故意制造缓存中不存在的 key,发起大量请求,穿过缓存,落在了数据库上。

# 缓存穿透的解决办法

最基本的就是⾸先做好参数校验,⼀些不合法的参数请求直接抛出异常信息返回给客户端。⽐如查询的数据库 id 不能⼩于 0、传⼊的邮箱格式不对的时候直接返回错误消息给客户端等等。

  1. 缓存⽆效 key

​ 如果缓存和数据库都查不到某个 key 的数据就写⼀个到 Redis 中去并设置过期时间。但是这种⽅案并不能从根本上解决此问题。

  1. 布隆过滤器

​ 布隆过滤器是一种巧妙的数据结构,是概率型数据库。是一个 bit 向量或者说 bit 数组。它有多种哈希函数。

布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率

布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素⼀定不在。

# 缓存击穿

# 什么是缓存击穿

👀缓存击穿是指缓存中的某个 key 突然失效(一般是缓存时间到期),但是这是的请求特别多,直接落到了数据库上,造成数据库的压力瞬间大增。

# 缓存击穿的解决办法

  1. 设置热点数据永远不过期。
  2. 加互斥锁

# 缓存雪崩

# 什么是缓存雪崩

👀缓存雪崩是指缓存中的数据在同一时间内大面积失效,导致大量请求落在数据库上,造成数据库短时间内承受大量请求,如雪崩一般,给数据造成超大的压力,可能导致宕机。

举个例⼦ :秒杀开始 12 个⼩时之前,我们统⼀存放了⼀批商品到 Redis 中,设置的缓存过期时间也是 12 个⼩时,那么秒杀开始的时候,这些秒杀的商品的访问直接就失效了。导致的情况就是,相应的请求直接就落到了数据库上,就像雪崩⼀样可怕。

# 缓存雪崩的解决办法

  1. 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
  2. 如果缓存数据库是分布式部署,Redis 集群,将热点数据均匀分布在不同搞得缓存数据库中。
  3. 设置热点数据缓存永远不过期。

# 如何保证缓存和数据库数据的一致性

⭐最简单的方式,也就是在更新数据库时,更新成功后直接删掉缓存。即 Cache Aside Pattern(旁路缓存模式)

如果数据库删除失败的,可以增加重试机制或者将缓存时间缩短。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

田埂、 微信支付

微信支付

田埂、 支付宝

支付宝

田埂、 贝宝

贝宝