缓存雪崩、击穿、击穿

2024-05-09 02:52
文章标签 缓存 击穿 雪崩

本文主要是介绍缓存雪崩、击穿、击穿,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

缓存雪崩:

就是大量数据在同一时间过期或者redis宕机时,这时候有大量的用户请求无法在redis中进行处理,而去直接访问数据库,从而导致数据库压力剧增,甚至有可能导致数据库宕机,从而引发的一些列连锁反应,导致整个系统崩溃。

缓存雪崩的场景通常有两个:

1.大量热点key同时过期;

2.缓存服务故障;

缓存雪崩的解决方案:

1.通常的解决方案是将key的过期时间后面加上一个随机数(比如随机1-5分钟),让key均匀的失效。

2.考虑用队列或者锁的方式,保证缓存单线程写,但这种方案可能会影响并发量。

3.热点数据可以考虑不失效,后台异步更新缓存,适用于不严格要求缓存一致性的场景。

4.双key策略,主key设置过期时间,备key不设置过期时间,当主key失效时,直接返回备key值。

5.构建缓存高可用集群(针对缓存服务故障情况)。

6.当缓存雪崩发生时,服务熔断、限流、降级等措施保障。

缓存击穿:

缓存雪崩是指只大量热点key同时失效的情况,如果是单个热点key,在不停的扛着大并发,在这个key失效的瞬间,持续的大并发请求就会击破缓存,直接请求到数据库,好像蛮力击穿一样。这种情况就是缓存击穿(Cache Breakdown)。

从定义上可以看出,缓存击穿和缓存雪崩很类似,只不过是缓存击穿是一个热点key失效,而缓存雪崩是大量热点key失效。因此,可以将缓存击穿看作是缓存雪崩的一个子集。

解决方法:

  1. 设置永不过期:对于一些热点数据,可以设置其key永不过期,这样即使缓存失效,也能保证这些数据能够被快速访问,从而减少对数据库的直接访问。
  2. 使用分布式锁:通过分布式锁来控制对某个资源的访问,确保同一时间只有一个请求去数据库查询数据,然后将结果更新到缓存中。这样可以避免多个请求同时访问数据库,造成的高负载。
  3. 预加载热点数据:在系统启动或应用程序运行时,提前加载并缓存那些可能会频繁被访问的热点数据。这样即使在缓存失效后,也能迅速从缓存中获取数据,而不是每次都去数据库查询。
  4. 限流:通过限流技术限制对热点资源的访问速率,避免因请求量过大而导致的缓存击穿现象。这可以通过设置请求的频率限制、延迟响应等方式实现。
  5. 二级缓存:设计一个二级缓存系统,当一级缓存失效时,可以尝试从二级缓存中获取数据,以此来减少对数据库的直接访问。
  6. 布隆过滤器:虽然布隆过滤器主要用于缓存穿透问题,但它也可以用来预防缓存击穿,因为它可以帮助判断一个请求是否可能访问到缓存中的数据,从而减少无效的数据库查询。

缓存穿透

缓存穿透(cache penetration)是用户访问的数据既不在缓存当中,也不在数据库中。出于容错的考虑,如果从底层数据库查询不到数据,则不写入缓存。这就导致每次请求都会到底层数据库进行查询,缓存也失去了意义。当高并发或有人利用不存在的Key频繁攻击时,数据库的压力骤增,甚至崩溃,这就是缓存穿透问题。

缓存穿透发生的场景一般有两类:

原来数据是存在的,但由于某些原因(误删除、主动清理等)在缓存和数据库层面被删除了,但前端或前置的应用程序依旧保有这些数据;

恶意攻击行为,利用不存在的Key或者恶意尝试导致产生大量不存在的业务数据请求。

缓存穿透通常有四种解决方案,我们逐一介绍分析。

方案一:缓存空值(null)或默认值

分析业务请求,如果是正常业务请求时发生缓存穿透现象,可针对相应的业务数据,在数据库查询不存在时,将其缓存为空值(null)或默认值。需要注意的是,针对空值的缓存失效时间不宜过长,一般设置为5分钟之内。当数据库被写入或更新该key的新数据时,缓存必须同时被刷新,避免数据不一致。

方案二:业务逻辑前置校验

在业务请求的入口处进行数据合法性校验,检查请求参数是否合理、是否包含非法值、是否恶意请求等,提前有效阻断非法请求。比如,根据年龄查询时,请求的年龄为-10岁,这显然是不合法的请求参数,直接在参数校验时进行判断返回。

方案三:使用布隆过滤器请求白名单

在写入数据时,使用布隆过滤器进行标记(相当于设置白名单),业务请求发现缓存中无对应数据时,可先通过查询布隆过滤器判断数据是否在白名单内,如果不在白名单内,则直接返回空或失败。

方案四:用户黑名单限制

当发生异常情况时,实时监控访问的对象和数据,分析用户行为,针对故意请求、爬虫或攻击者,进行特定用户的限制;

当然,可能针对缓存穿透的情况,也有可能是其他的原因引起,可以针对具体情况,采用对应的措施。

总结:

这篇关于缓存雪崩、击穿、击穿的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972186

相关文章

服务器雪崩的应对策略之----SQL优化

SQL语句的优化是数据库性能优化的重要方面,特别是在处理大规模数据或高频访问时。作为一个C++程序员,理解SQL优化不仅有助于编写高效的数据库操作代码,还能增强对系统性能瓶颈的整体把握。以下是详细的SQL语句优化技巧和策略: SQL优化 1. 选择合适的数据类型2. 使用索引3. 优化查询4. 范式化和反范式化5. 查询重写6. 使用缓存7. 优化数据库设计8. 分析和监控9. 调整配置1、

设置Nginx缓存策略

详细信息 Nginx服务器的缓存策略设置方法有两种:add_header或者expires。 1. add_header 1)语法:add_header name value。 2)默认值:none。 3)使用范围:http、server、location。 配置示例如下: add_header cache-control "max-age=86400";#设置缓存时间为1天。add

【MyBatis学习7】MyBatis中的一级缓存

缓存的作用是减轻数据库的压力,提高数据库的性能的。mybatis中提供了一级缓存和二级缓存,先来看一下两个缓存的示意图:    从图中可以看出: 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。二级缓存是mappe

java NIO 缓存区之内核空间、用户空间和虚拟地址

IO是基于缓存区来做的,所谓的输入和输出就是从缓存区中移入和移出数据。以IO输入为例,首先是用户空间进程向内核请求某个磁盘空间数据,然后内核将磁盘数据读取到内核空间的buffer中,然后用户空间的进程再将内核空间buffer中的数据读取到自身的buffer中,然后进程就可以访问使用这些数据。     内核空间是指操作系统内核运行的空间,是为了保证操作系统内核的能够安全稳定地运行而为内核专

黑马苍穹外卖6 清理redis缓存+Spring Cache+购物车的增删改查

缓存菜品 后端服务都去查询数据库,对数据库访问压力增大。 解决方式:使用redis来缓存菜品,用内存比磁盘性能更高。 key :dish_分类id String key= “dish_” + categoryId; @RestController("userDishController")@RequestMapping("/user/dish")@Slf4j@Api(tags = "

Linux - 利用/proc/sys/vm/drop_caches实现手工清理系统缓存

文章目录 现象`buff/cache` 的作用和含义分析 `buff/cache` 占用大量内存的原因是否需要清理缓存及其方法 命令清理缓存方法1. `sync` 命令2. `echo 3>/proc/sys/vm/drop_caches` 命令 注意事项小结 现象 使用free 命令,看到 buff/cache 占用很多 。 free 命令用于显示系统内存的使用情

腾讯视频客户端缓存提取mp4文件工具

在腾讯视频客户端看过视频之后,可以利用本软件,从缓存中提取看过的视频。提取的视频将会保存为MP4文件。 下载地址:http://download.csdn.net/detail/u012107143/9769624 代码如下: @echo offsetlocal ENABLEDELAYEDEXPANSION:INPUT_PATHset video_path=F:\16

LeetCode 算法:LRU 缓存 c++

原题链接🔗: 难度:中等⭐️⭐️ 题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key)如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, i

mybatis的延迟加载,一级缓存,二级缓存

MyBatis 延迟加载,一级缓存,二级缓存设置 什么是延迟加载          resultMap中的association和collection标签具有延迟加载的功能。         延迟加载的意思是说,在关联查询时,利用延迟加载,先加载主信息。使用关联信息时再去加载关联信息。 设置延迟加载         需要在SqlMapConfig.xml文件中,在<se

android中图片内存缓存的工具类的实现

android中实现图片缓存的工具类的实现: package com.demo.loading;import java.lang.ref.SoftReference;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.concurrent.ConcurrentHashMap;import andr