首页 > 数据库 >[Redis]缓存穿透/缓存击穿/缓存雪崩

[Redis]缓存穿透/缓存击穿/缓存雪崩

时间:2024-08-17 23:06:00浏览次数:13  
标签:缓存 请求 Redis 布隆 雪崩 哈希 过滤器 数据

缓存穿透

用户访问一些不存在的数据,redis没有,于是去mysql查询也没有,这样就发生了两次无效的查询。

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,缓存永远不会生效。这样,每次针对此 key 的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户 id 获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

解决方案

布隆过滤器

设置布隆过滤器,布隆过滤器实际上就是一个数组加上几个哈希函数。

如果布隆过滤器告诉我们这个数据不存在那就一定不存在,如果他说存在,那也不一定存在。

原理是,使用多个哈希函数,把一个key值使用多个哈希函数进行运算,把相应的位置设置为1。
当我们想要请求某个数据的时候,先用这几个哈希函数映射到数组的几个位置,如果这几个位置都是1,那就是存在,否则就不存在。

使用多个哈希函数是为了避免哈希冲突,从而减少误判,哈希冲突会导致,例如A和B使用同一个哈希函数产生了哈希冲突,先把A放进缓存,然后我们想要获取B的时候发现相应位置上的标志位已经被设置了,那我们以为这个数据是存在的,但实际上这个位置是因为哈希冲突被另一个数据标志的,增加哈希函数可以降低哈希冲突的概率。

  • 对空值进行缓存:即使一个查询返回的数据为空,仍然把这个空结果(null)进行缓存,同时还可以对空结果设置较短的过期时间。这种方法实现简单,维护方便,但是会额外的内存消耗。
  • 采用布隆过滤器:(布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
  • 进行实时监控:当发现 Redis 的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务
  • 增强 id 的复杂度,避免被猜测 id 规律
  • 做好数据的基础格式校验
  • 加强用户权限校验

缓存击穿

redis删掉了热点数据,导致大量请求发送到mysql。

解决方案

互斥锁

这种情况下,线程的逻辑应该是这样的,

首先去查缓存,

  • 如果缓存里没有,尝试去设置一个分布式锁(这里实际上就是在redis中set一个键值对set ex nx),谁先设置成功了谁就获得了这个锁,

相关文章

  • [Redis]延迟消息队列
    延迟消息队列redis数据结构,用什么结构实现延迟消息队列延迟消息队列是一种消息队列系统,它允许消息的发布者在消息发送时指定消息的投递时间,使消息在未来的某个预定时间点被消费者接收。这种机制对于需要在稍后执行的任务或具有特定延迟需求的应用非常有用。对于实现延迟消息队......
  • Redis中Big Key该如何解决?
    目录1、BigKey的产生2、BigKey场景分析3、BigKey的危害4、检测BigKey 5、解决BigKey问题BigKey拆分(1)按时间/业务拆分(2)按哈希(Hash)拆分(3)按前缀树拆分BigKey定期清理Bigkey压缩BigKey批处理优化持久化配置6、总结 BigKey问题是指某个键(key)的值(value)......
  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • Redis中Set数据类型常用命令
    目录1.添加元素2.移除元素3.检查成员是否存在4.获取集合成员5.获取集合成员数量6.随机获取集合中的一个成员7.集合运算8.集合的移值9.提供集合的随机元素在Redis中,Set是一种无序且不重复的字符串集合。1.添加元素SADDkeymember[member...]:向集......
  • Redis中Sorted Set数据类型常用命令
    目录1.添加元素2.获取成员3.获取成员的分数4.删除元素5.获取集合的大小6.获取成员的排名7.按分数范围获取成员8.按排名范围获取成员9.增减分数10.删除指定分数范围的成员11.获取分数的范围在Redis中,SortedSet(有序集合)是一种重要的数据类型,它的每......
  • 深入理解 Spring 三级缓存:解决单例 Bean 循环依赖的利器
    目录一、什么是循环依赖?二、关于传说中的三级缓存1.基本概念:2.三级缓存是哪三级? 3.【举个例子】那三级缓存是怎么解决上述代码例子中的A、B互相依赖呢?详细过程:(理解用)简约版:(理解后看这个就行)三、关于三级缓存的适用范围适用的循环依赖范围:不适用的循环依赖范围:四、......
  • Redis的基本概念和使用
    目录一、Redis简介1、NOSQL2、NOSQL和关系型数据库比较3、主流的NOSQL产品4、什么是Redis5、启动Redis二、Redis基本操作1、大概操作三、 Redis数据类型(5种常用)1、redis数据存储格式2、String3、hash4、list5、Set6、sorted_set四、Jedis1、导入对应的依......
  • 一篇总结Redis面试题知识点
    为什么要使用Redis        使用Redis主要是因为Redis的三大特性,高可靠高并发高性能。在请求访问数据时,如果直接从数据库中获取数据,它的并发量可能只有1000次/秒,这已经算是很不错的表现。如果在程序启动的时候就将数据放到Redis中,数据访问时如果直接从缓存中读取,他的性......
  • Vue 实现 动态添加Tab 页签及页面缓存功能
    概述在现代Web应用中,Tab页签功能是非常常见的一种交互模式。它可以帮助用户在不同的视图间快速切换,而不会丢失当前视图的状态。为了进一步提升用户体验,我们可以通过keep-alive组件来缓存已经打开的视图,这样即使用户离开并再次回到这个视图,也可以看到之前的状态。本文将......
  • Redis底层原理
    1.Redis主从单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。1.1.单节点Redis的并发能力单节点Redis的并发能力确实是有限的。主要原因包括以下几点:单线程模型:Redis采用单线程模型来处理请求,这意味着它一次只能处理一个请求,......