Redis-缓存穿透(布隆过滤器详解)、缓存击穿、缓存雪崩及解决方案

在这里插入图片描述


更多相关内容可查看

Redis缓存穿透

缓存穿透是什么

缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库。

在这里插入图片描述

缓存穿透的处理方案

  1. 最基本的就是首先做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等
  2. 缓存无效 key , 如果缓存和数据库都查不到某个 key 的数据就写一个到 Redis 中去并设置过期时间 , 尽量将无效的 key 的过期时间设置短一点比如 1 分钟
  3. 布隆过滤器 , 提前将数据库中存在的数据加载到布隆过滤器 , 当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走下面的流程

布隆过滤器详解

布隆过滤器介绍

布隆过滤器(Bloom Filter)是一个由布隆在1970年提出的算法,它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器的主要应用是快速检索一个元素是否在一个集合中,而无需访问实际的集合。

布隆过滤器底层原理

布隆过滤器通过K个散列函数(Hash函数)将一个元素映射成一个位数组(Bit array)中的K个点,并将这些点设置为1。当需要检索一个元素时,布隆过滤器会检查这些点是否都是1。如果所有点都是1,那么该元素可能存在于集合中(但存在误判的可能性);如果有任何一个点是0,那么该元素一定不在集合中。

优点
  • 空间效率:相比于其他数据结构,布隆过滤器在存储空间和查询时间方面都有巨大的优势。它的存储空间和插入/查询时间都是常数。
  • 并行处理:Hash函数相互之间没有关系,这使得布隆过滤器可以方便地由硬件并行实现。 保密性:布隆过滤器不需要存储元素本身,只存储元素的哈希值,这在某些对保密要求非常严格的场合有优势。
  • 表示全集:布隆过滤器可以表示全集,即它可以用来检测一个元素是否存在于一个非常大的集合中,而其他任何数据结构都不能做到这一点。
缺点
  • 误判率:布隆过滤器存在一定的误判率,即它可能会错误地认为一个不在集合中的元素存在于集合中。随着存入的元素数量增加,误判率也会随之增加。常见的补救方法是建立一个小的白名单,存储那些可能被误判的元素。
  • 删除困难:布隆过滤器不支持从集合中删除元素。虽然理论上可以通过将位数组中的相应位置为0来实现删除操作,但这需要确保被删除的元素确实存在于布隆过滤器中,并且还需要处理计数器回绕等问题。因此,删除元素需要很高的成本。
应用场景

布隆过滤器在许多领域都有应用,包括但不限于:

  • 网络安全:用于检测恶意代码的僵尸网络、分析不断变化的市场数据、过滤垃圾邮件等
  • 生物信息学:用于快速查找DNA测序数据中的基因序列,以及应用于其他生物学和遗传学领域如蛋白质组学、转录组学和基因组学等。
  • 数据分析:用于检测网站中的指定元素(如URL中的关键字、用户搜索的关键字等),帮助企业进行非结构化大数据分析,找出其中的趋势。
  • 机器学习:用于快速处理海量数据,提取特征,提升模型性能

Redis缓存击穿?

缓存击穿是什么

某个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,导致数据库存在被打挂的风险

缓存击穿的场景

缓存击穿问题的产生通常是因为一些热点数据的缓存过期时间被设置为相同,当这些热点数据的缓存同时过期时,大量请求会绕过Redis而直接访问数据库,从而导致数据库负载急剧上升。

缓存击穿的处理方案

  • 加互斥锁。当热点key过期后,大量的请求涌入时,只有第一个请求能获取锁并阻塞,此时该请求查询数据库,并将查询结果写入redis后释放锁。后续的请求直接走缓存
  • 设置缓存不过期或者后台有线程一直给热点数据续期
  • 设置不同的过期时间:为了避免大量热点数据的缓存同时过期,可以为这些数据的缓存设置不同的过期时间,使得它们在不同的时间点过期,从而避免大量请求同时访问数据库
  • 预先加载数据:对于某些热点数据,可以在缓存过期之前预先加载到缓存中,从而避免缓存击穿的发生。

Redis缓存雪崩?

缓存雪崩是什么

缓存雪崩是指缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求。这就好比雪崩一样,摧枯拉朽之势,数据库的压力可想而知,可能直接就被这么多请求弄宕机了。

缓存雪崩的场景

  • 缓存统一过期:当大量缓存设置了相同的过期时间,且没有加以控制时,这些缓存会同时失效,导致大量请求直接访问数据库。
  • 单点故障:如果Redis服务器出现故障,所有缓存都无法访问,这也会导致请求直接落到数据库上。
  • 系统压力:系统承受的压力过大,导致缓存服务器崩溃,进而导致缓存失效

缓存雪崩的处理方案

  • 采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用
  • 限流,避免同时处理大量的请求
  • 设置不同的失效时间比如随机设置缓存的失效时间
  • 针对热点数据设置缓存永不失效
  • 使用互斥锁:当业务线程在处理用户请求时,如果发现访问的数据不在Redis里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存(从数据库读取数据,再将数据更新到Redis里),当缓存构建完成后,再释放锁。未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。

本篇小结

Redis数据持久化策略
Redis数据过期策略
Redis数据淘汰策略
Redis集群方案
Redis主从同步
Redis分片集群如何存储及读取数据
Redis跟Mysql如何保证数据一致性
Redis的缓存穿透、缓存击穿、缓存雪崩及解决方案
Redis分布式锁实现方式

  • 32
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值