首页 > 数据库 >什么是Redis 雪崩、缓存"鸡"穿、缓存穿透?及出现的原因,如何预防

什么是Redis 雪崩、缓存"鸡"穿、缓存穿透?及出现的原因,如何预防

时间:2023-06-21 16:35:13浏览次数:42  
标签:导致 缓存 请求 数据库 Redis 穿透 雪崩

Redis 雪崩:

在某个时间段,Redis的部分节点或者全部节点都挂掉了,导致Redis无法提供服务,请求全部转移到后端数据库,从而压垮数据库的情况。Redis雪崩通常由于某些原因导致缓存中的数据批量失效或者过期,导致后续请求都落到了数据库上,使得数据负载和请求量急剧增大,最终导致数据库的性能急剧下降甚至挂掉。

造成Redis雪崩的原因可能有:

  1. Redis本身故障
  2. Redis部署问题,如不合理的分布式部署、过于集中的部署等;
  3. 数据库请求的热点集中,如在某个时间段上某个关键字的请求量激增;
  4. 大批量缓存数据失效或者过期;
  5. 攻"坤"和误用,如故意大批量的请求、故意设置全部过期时间等。

为防止Redis雪崩,可以从以下方面入手:

  1. 合理设置缓存策略,如对热点数据设置较短的过期时间,以避免大批量缓存数据同时失效的情况;
  2. Redis集群化部署,尽量避免全部节点挂掉的情况;
  3. 备份数据源,如设置数据备份或者多副本存储;
  4. 对关键词请求做限流,避免低效、高频请求对数据库造成的影响;
  5. 监控数据库的访问情况,一旦出现异常一定要及时发现并排查问题


Redis 缓存击穿:

指在高并发场景下,一个或多个热点的缓存数据过期或被删除,导致大量并发请求落到了后端数据库上,造成数据库压力剧增,甚至导致服务宕机的情况。

出现Redis缓存击穿的原因可能有以下几点:

  1. 缓存数据失效:由于缓存数据的有效期到了或被手动删除,导致大量请求需要重新查询数据库获取数据。这种情况在高并发场景下容易出现。
  2. 热点数据集中:由于业务需求或者其他原因,部分数据被频繁访问,成为热点数据。当这些数据集中到一个缓存 key 上时,容易发生缓存击穿。
  3. 预热不足:当应用首次启动或者数据发生变化后,需要将数据加载到缓存中。但是如果数据量很大或者预热不及时,可能会导致缓存击穿。
  4. 服务器宕机:当 Redis 服务器宕机或者 Redis 所在服务器出现问题时,会导致缓存不能正常使用,进而导致缓存击穿。


为避免Redis缓存击穿,可以从以下方面入手:

  1. 设置永不过期的热点数据,或者采用互不干扰的数据切分策略,以避免大量的请求打入单个热点造成的击穿问题;
  2. 针对可能出现的缓存击穿,采用分布式锁或互斥锁的方式,保证只有一个请求能够进行数据库查询,并且将查询结果写入缓存,其他请求则直接从缓存读取。
  3. 如果读压力远大于写压力,可以使用互斥锁空置缓存,避免历史垃圾数据长期占用缓存空间。
  4. 对客户端请求进行限流,避免大量请求在短时间内同时到达,造成缓存打满和数据库瞬时压力过大的情况。


Redis缓存穿透:

缓存穿透是指恶意攻"坤"者通过构造不存在于缓存和存储介质中的键值对,来请求Redis的过程,从而导致缓存被击穿,应用负载升高以及后端存储压力增加,最终影响服务的可用性和稳定性。

Redis缓存穿透的原因可能有以下几点:

  1. 缓存和存储介质不同步造成的穿透:在缓存层时,由于某些异步操作或者数据处理逻辑错误,导致某些数据未及时从后端存储同步到缓存中。当恶意攻"坤"者将这些未同步的数据作为查询条件的一部分,访问应用程序时,缓存不会命中,从而导致缓存穿透。
  2. 恶意构造查询条件导致的穿透:恶意攻"坤"者可能会故意构造一些不存在于缓存和存储介质中的数据作为查询条件的一部分,来访问应用程序,导致缓存与后端存储都无法命中,从而引发穿透。
  3. 应用程序缓存处理逻辑不完善造成的穿透:应用程序可能会存在缓存处理逻辑不完善的情况,例如没有对查询条件进行严格的校验或者未考虑到缓存失效的情况,从而导致缓存穿透。


为了防止Redis缓存穿透攻"坤",可以采用一些防御措施,例如:

  1. 对前端传入的查询参数进行限制和过滤。
  2. 对缓存不存在的数据做标记或者直接将请求拦截。
  3. 引入布隆过滤器,将查询条件加入到布隆过滤器中,如果查询条件不在布隆过滤器中直接拦截请求。

标签:导致,缓存,请求,数据库,Redis,穿透,雪崩
From: https://blog.51cto.com/u_16166485/6529630

相关文章

  • 商户查询缓存
    什么是缓存缓存就是数据交换的缓冲区,是存数据的临时地方,一般读写性能较高添加Redis缓存ShopServiceImpl@OverridepublicResultqueryById(Longid){StringshopJson=stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY+id);Gsongson=newGson(......
  • MySQL查询缓存的优缺点
    1.MySQL查询缓存的优缺点目录1.MySQL查询缓存的优缺点1.1.前言1.2.工作原理1.3.查询缓存对什么样的查询语句,无法缓存其记录集,大致有以下几类:1.4.查询缓存的优缺点:1.5.查询缓存的配置1.6.维护1.6.1.查询缓存区的碎片整理1.6.2.清空查询缓存的数据1.7.性能监控1.8.适合......
  • 如何利用Redis实现对数据去重?
    要使用Redis实现数据去重,可以利用Redis的Set数据结构和它的去重特性。下面是一种基本的方法:连接到Redis服务器:首先,确保你已经安装并正确地配置了Redis服务器,并且能够连接到它。创建一个Set:在Redis中,可以使用以下命令创建一个Set:SADDset_nameitem1item2item3...这里的set_name......
  • 基于Redis实现查找附近的人/排行榜
    引言   在日常使用的有些APP中,想什么微信,百度地图,可以可以搜寻附近的人,距离自己多远,以及在地图上我们可以搜索附近的某个地点,距离自己的位置。针对这种类似的功能,我们可以通过redis就能实现。redis在3.2版本之后也提供了地理位置的能力,使用redis可以轻松实现查找附近的人......
  • Redis持久化方案
    Redis有两种持久化方案RDB持久化AOF持久化RDB持久化RDB全称RedisDatabaseBackupfile(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运......
  • MySQL 关于缓存的 “杂七杂八”
    开头还是介绍一下群,如果感兴趣polardb,mongodb,mysql,postgresql,redis等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。你是否可以想象如果MYSQL没有了innodb_buffer_pool是什么样子的情况,本期需要说说MYSQL的缓存,已经如何使用他更加有效用或者说性......
  • 抛砖引玉:Redis 与 接口自动化测试框架的结合
    接口自动化测试已成为保证软件质量和稳定性的重要手段。而Redis作为一个高性能的缓存数据库,具备快速读写、多种数据结构等特点,为接口自动化测试提供了强大的支持。勇哥这里粗略介绍如何结合Python操作Redis,并将其应用于接口自动化测试框架中,以提升测试效率和数据管理能力。Redi......
  • redis迁移
    redis的几种数据导入导出方式【转】 环境说明:202.102.221.11redis源实例202.102.221.12redis目标实例202.102.221.13任意linux系统一、redis-dump方式1.安装redis-dump工具[[email protected]~]#yuminstallrubyrubygemsruby-devel-y#更改gem源[root......
  • redis学习十一:数据类型命令及落地运用 (GEO)
    redis之地理空间GEO1.geoaddkeylongitudelatitude名称;zrangekey0-1查看如果出现乱码问题登录时候加上--raw 2.geoposkey名称获取对应经纬度 3.用geohash表示 4.geodist距离多少km/m 5.georadius这个尚硅谷的杨哥写的这个比较详细,直接截图照搬了。 6......
  • MongoDB批量导入Redis优化迭代笔记
    背景统计最近五天所有content信息的正文字节数(正文字段占用较多),然后根据这个大小,推送存在redis要配置多少的内存。统计方法1.在mongodb中查询db.content_.aggregate([{$match:{updatetime:{$gte:1686134400000,//对应日期"2023-06-07T00:00:00Z"的......