首页 > 数据库 >redis中的缓存雪崩、穿透

redis中的缓存雪崩、穿透

时间:2024-04-15 23:22:59浏览次数:25  
标签:缓存 请求 过期 redis 数据库 Redis 雪崩

Redis 在作为缓存系统时,可能会面临几种常见的问题,其中包括缓存雪崩和缓存穿透。这些问题都可能导致系统性能下降甚至服务不可用。了解它们的原因及解决方案对于设计高可靠性系统至关重要。

缓存雪崩

定义:缓存雪崩是指在同一时间大量的缓存项过期,导致大量请求直接打到数据库上,从而引起数据库负载急剧上升甚至崩溃。

例子:假设一个在线商城系统使用 Redis 缓存商品的价格信息,所有商品的缓存设置了相同的过期时间,比如 24 小时。如果这些商品的缓存几乎同时到期,那么突然有大量的用户访问这些商品,所有的请求都会直接查询数据库来获取价格,这可能导致数据库负载过高,甚至服务崩溃。

解决方案

  • 不同的过期时间:为缓存项设置随机的过期时间,确保不会在同一时刻大量缓存过期。
  • 使用持久层的备份:在 Redis 失效时,可以使用其他形式的备份,如备用缓存,以减少对数据库的压力。
  • 提高数据库容错性:优化数据库性能,如增加读写分离、数据库集群等。
  • 使用限流和熔断机制:在系统设计时引入限流和熔断机制,保证在高负载时不会导致整个系统崩溃。

缓存穿透

定义:缓存穿透是指查询不存在的数据,由于缓存不命中,每次请求都会穿过缓存直接查询数据库,如果有大量此类查询,会对数据库造成不必要的压力。

例子:继续上面的在线商城例子,如果攻击者故意查询不存在的商品ID,这些请求会因为在 Redis 中找不到对应的缓存而直接访问数据库。如果查询量很大,会导致数据库负载过大。

解决方案

  • 缓存空对象:对于查询结果为空的情况,也将其作为特定的空对象存入缓存,并设置较短的过期时间。这样可以防止对同一不存在的数据频繁查询数据库。
  • 布隆过滤器:使用布隆过滤器预先判断请求的数据是否可能存在于数据库中。布隆过滤器可以非常高效地检查一个元素是否在一个集合中,虽然有一定的误判率,但适合用于拦截绝大部分无效请求。
  • 接口安全校验:加强对入口请求的校验,比如请求频率限制、用户身份验证等,防止恶意请求到达后端服务。

通过理解和采取措施应对这些缓存相关的问题,可以显著增强使用 Redis 的应用的稳定性和可靠性。

标签:缓存,请求,过期,redis,数据库,Redis,雪崩
From: https://www.cnblogs.com/sincisco/p/18137166

相关文章

  • 缓存数据“消失”之谜
    吃一堑,长一智。“邪门!真是邪门!”自从踏入Go的领域之后,奇事怪事接连不断。很多看上去似乎没啥问题的代码,可就是有问题,可怎么也看不出问题所在。问题背景事情是这样的:有两个流程和一个缓存数据:流程一:接收kafka数据,解析模型数据,并存入缓存modelCache:localCache[hash]M......
  • DruidDataSource的缓存策略
    DruidDataSource的缓存策略主要是用来优化数据库连接池的性能和提高资源利用效率。缓存策略在数据库连接池中扮演着重要角色,通过合理管理数据库连接,减少频繁创建和销毁连接的开销,从而提高应用程序的响应速度和吞吐能力。以下是一些关键点来解释DruidDataSource的缓存策略及其作用......
  • redis主从复制
    目录一、什么是redis主从复制1、主从复制架构2、redis为什么需要主从复制二、搭建主从复制1、涉及主机2、编译安装redis2.1、获取软件安装包,安装编译环境2.2、编译安装2.3、配置变量2.4、验证目录结构2.5、准备目录及文件3、前台启动redis3.1、消除三个警告提示4、使用systemctl管......
  • 数据库和缓存如何保证一致性
    保证数据库和缓存之间的一致性是在许多应用程序中面临的挑战。数据库和缓存是两个不同的存储层,具有不同的特性和行为。在使用缓存的同时,确保数据库和缓存之间的数据一致性是至关重要的。 针对读请求,流程较简单,先读取缓存,缓存命中则返回结果,缓存未命中则读取数据库,并将读取的数......
  • mybatis一级缓存
    一级缓存默认:mybatis默认开启一级缓存,且local-cache-scope默认session级别,默认关闭二级缓存配置如下:mybatis关闭二级缓存,一级缓存作用范围为session;查询语句也没有使用flushCache=“true”(默认false)==>所以使用了缓存,但是这样直接操作缓存对象,下一次查询出来的是被修改后的......
  • SpringBoot+Redis启动报错Unsatisfied dependency expressed through method 'stringR
    SpringBoot+Redis启动报错Applicationrunfailedorg.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'redisTool':Unsatisfieddependencyexpressedthroughfield'stringRedisTemplate';nestedexcep......
  • 淘宝二面:MySQL里有2000万条数据,但是Redis中只存20万的数据,如何保证redis中的数据都是
    引言在当今互联网领域,尤其在大型电商平台如淘宝这样的复杂分布式系统中,数据的高效管理和快速访问至关重要。面对数以千万计的商品、交易记录以及其他各类业务数据,如何在MySQL等传统关系型数据库之外,借助内存数据库Redis的力量,对部分高频访问数据进行高效的缓存处理,是提升整个系统......
  • 聊聊 Redis Stream
    RedisStream是Redis5.0版本中引入的一种新的数据结构,它用于实现简单但功能强大的消息传递模式。这篇文章,我们聊聊RedisStream基本用法,以及如何在SpringBoot项目中应用RedisStream。1基础知识RedisStream的结构如下图所示,它是一个消息链表,将所有加入的消息都......
  • 详解K8s 镜像缓存管理kube-fledged
    本文分享自华为云社区《K8s镜像缓存管理kube-fledged认知》,作者:山河已无恙。我们知道 k8s 上的容器调度需要在调度的节点行拉取当前容器的镜像,在一些特殊场景中,需要快速启动和/或扩展的应用程序。例如,由于数据量激增,执行实时数据处理的应用程序需要快速扩展。镜像比......
  • Redis报错:CROSSSLOT Keys in request don't hash to the same slot的解决方案
    最近,项目上线的时候,出现了一个Redis的报错:CROSSSLOTKeysinrequestdon'thashtothesameslot,这个在内网环境下无法复现,因为正式环境的Redis是cluster集群模式,而我们内网环境是单机模式。(后面我在内网也部署了一个Redis集群,具体见我这一篇文章《使用Docker搭建RedisCluste......