Redis缓存(缓存预热,缓存穿透,缓存雪崩,缓存击穿)

news2024/11/15 17:35:37

目录

一, 缓存

1, 什么是缓存

2, 什么是热点数据(热词)

3, 缓存更新策略

3.1 定期生成

3.2 实时生成

二, Redis缓存可能出现的问题

1, 缓存预热

1.1 什么是缓存预热

1.2 缓存预热的过程

2, 缓存穿透

2.1 什么是缓存穿透

2.2 缓存穿透产生的原因

2.3 缓存穿透的解决办法

3, 缓存雪崩

3.1 什么是缓存雪崩

3.2 缓存雪崩产生的原因

3.3 缓存雪崩的解决办法

4, 缓存击穿

4.1 什么是缓存击穿

4.2 缓存雪崩的解决办法


一, 缓存

1, 什么是缓存

Redis是一种内存数据库,最常用的场景就是作为缓存,加快用户查询的速度,核心思路就是把一些常用的数据(热点数据)放到触手可及(访问速度更快)的地方,方便随时读取.

1. 如何理解"触手可及"的地方?

硬件的访问速度,通常情况下:CPU寄存器 > 内存 > 硬盘 > 网络

硬盘相对于网络来说是"触手可及的",就可以使用硬盘作为网络的缓存(例如:浏览器的缓存,浏览器通过 http/https 从服务器上获取到如 html,css,js,图片,字体等进行展示,这些体积大又不会经常改变的数据就可以保存到浏览器本地硬盘,后续再打开这个页面的时候,就不必从网络上重新获取了)

2. 为什么说关系型数据库性能不⾼?

  1. 数据库把数据存储在硬盘上, 硬盘的 IO 速度并不快. 尤其是随机访问;
  2. 如果查询不能命中索引, 就需要进⾏表的遍历, 这就会⼤⼤增加硬盘 IO 次数;
  3. 关系型数据库对于 SQL 的执⾏会做⼀系列的解析, 校验, 优化⼯作;
  4. 如果是⼀些复杂查询, ⽐如联合查询, 需要进⾏笛卡尔积操作, 效率更是降低很多.

Redis作为缓存的图示:

2, 什么是热点数据(热词)

注意:Redis作为缓存的时候访问速度相比mysql等关系型数据库更快,访问速度快代表着成本越高,所以相对而言Redis的存储空间更少,所以一般存储在Redis里面的数据都是一些经常被访问的数据,这部分数据就被称为热点数据.

Redis作为缓存的时候一般满足"二八原则",即20%的数据可以满足大部分的访问需求,因为一般用户进行访问的时候大部分访问的数据都是热点数据,这些数据已经存储在Redis中,所以访问速度很快,且很多访问都只会命中Redis,不会去数据库中查找,大大降低了访问数据库的并发量.

3, 缓存更新策略

3.1 定期生成

定期生成策略就是会把访问的数据以日志的形式记录下来,然后根据更新的频率(一天更新一次/一周更新一次等)进行统计,统计该频率内访问最多的前20%(根据实际场景决定)作为热点数据,将这些热点数据存储到Redis中,下次访问这些热点数据的时候就可以快速的从Redis中获取了.

优点:这种方式实现起来比较简单,过程更可控(缓存中有啥都是固定的),方便后期排查问题;

缺点:实时性不高,如果出现一些突发性问题,有一些本来不是热词的词突然变成热词,Redis中并没有,此时就会直接访问数据库,数据库会面临巨大的压力.

3.2 实时生成

实时生成策略就是如果查询的数据在Redis中有就直接访问,如果没有就会在数据库中查询,返回结果的同时也会将查询的结果写入Redis,这样Redis的数据也会随着查询数据库这个操作不断更新,经过一段时间的"动态平衡",Redis中的数据逐渐成为热点数据了.

问题:Redis的存储空间是有限的,随着不断的更新会逐渐达到Redis的内存上限(Redis的内存可通过配置文件中的maxmemory参数进行设定),如果此时达到内存上限了该怎么办?

答:达到内存上限需要对Redis内存中的数据进行淘汰,通用的淘汰策略有以下几种:

FIFO (First In First Out) 先进先出:把缓存中存在时间最久的(也就是最先来的数据)淘汰掉;

LRU (Least Recently Used) 淘汰最久未使⽤的:记录每个key最近访问时间,把最近访问时间最老的key淘汰掉;

LFU (Least Frequently Used) 淘汰访问次数最少的:记录每个key最近一段时间的访问次数,把访问次数最少得淘汰掉;

Random 随机淘汰:从所有key中抽取幸运儿被随机淘汰掉.

二, Redis缓存可能出现的问题

1, 缓存预热

1.1 什么是缓存预热

使⽤ Redis 作为 MySQL 的缓存的时候, 当 Redis 刚刚启动, 或者 Redis ⼤批 key 失效之后, 此时由于 Redis ⾃⾝相当于是空着的, 没啥缓存数据, 那么 MySQL 就可能直接被访问到, 从⽽造成较⼤的压⼒. 因此就需要提前把热点数据准备好, 直接写⼊到 Redis 中.,使 Redis 可以尽快为 MySQL 撑起保护伞.

1.2 缓存预热的过程

缓存预热结合了定期生成和实时生成两种策略,先通过离线的方式,通过一些统计途径,把一些热点数据找到一批,导入到Redis中,此时这部分热点数据就可以帮数据库承担很大的压力了,随着时间的推移,逐渐就使用新的热点数据淘汰掉旧的数据.

2, 缓存穿透

2.1 什么是缓存穿透

访问的key在Redis和数据库中都不存在,此时这样的key不会被放到缓存上,后续如果仍然再访问这个key的时候依然会访问到数据库,这样就会导致数据库承担的请求太多,压力很大,这种情况被称为缓存穿透.

2.2 缓存穿透产生的原因

  • 业务设计的不合理,比如缺少必要的参数校验环节,导致非法的key也被查询了(这种情况最多);
  • 开发/运维误操作,不小心把部分数据从数据库中删除了(少);
  • 黑客恶意攻击(少).

2.3 缓存穿透的解决办法

  • 针对要查询的参数进行严格的校验,比如要查询的key是用户的手机号,那么就需要校验当前key是否满足一个合法的手机号的格式;
  • 针对数据库上不存在的key也需要在Redis中保存,该key所对应的value可以设置为空,避免后续频繁访问数据库;
  • 使用布隆过滤器(本质上使用hash+bitmap的思想,能够用较少的空间判定某个元素是否存在)先判定key是否存在,再进行查询.

3, 缓存雪崩

3.1 什么是缓存雪崩

短时间内⼤量的 key 在缓存上失效, 导致数据库压⼒骤增, 甚⾄直接宕机

3.2 缓存雪崩产生的原因

大规模的key失效,可能性主要有两种:

  • Redis挂了;
  • Redis上的大量key同时失效(可能这些key设置了相同的过期时间).

3.3 缓存雪崩的解决办法

  • 加强监控警报,加强Redis集群可用性的保证;
  • 不给key设置过期时间或者不设置相同的过期时间(如添加随机因子从而避免同一时刻过期).

4, 缓存击穿

4.1 什么是缓存击穿

相当于缓存雪崩的特殊情况. 针对热点 key , 突然过期了, 导致⼤量的请求直接访问到数据库上, 甚⾄引起数据库宕机,缓存击穿区分于缓存雪崩的地方在于缓存击穿更加侧重于热点key.

4.2 缓存雪崩的解决办法

  • 基于统计的方式发现热点key,并设置永不过期;
  • 进行必要的服务降级,例如访问数据库的时候使用分布式锁,限制同时请求数据库的并发数.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html表格标签

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><!--表格table 行 tr 列 td --> <table border"1px"><tr> <!--colsp…

《数据结构与算法之美》读书笔记1

Java的学习 方法参数多态&#xff08;向上和向下转型&#xff09; 向上转型&#xff1a; class Text{public static void main(String[] args) {Animals people1 new NiuMa();people1.eat1();//调用继承后公共部分的方法&#xff0c;没重写调用没重写的&#xff0c;重写了调…

DataGridView的下拉DataGridViewComboBoxColumn的数据绑定问题

DataGridView的下拉DataGridViewComboBoxColumn的数据绑定问题 需求&#xff1a;左边这列固定x行&#xff0c;右边显示下拉&#xff0c;并且赋上默认值 public void Set(){// 添加需要固定显示的行数dataGridView1.Rows.Add("早班";dataGridView1.Rows.Add("中…

电脑技巧:笔记本电脑网络不显示wifi列表解决办法

目录 1.WiFi功能被关闭 2.启用了飞行模式 3.WLAN连接被禁用 4.无线网卡驱动未安装 5.WLAN AutoConfig服务未启动 我的笔记本电脑连接wifi时&#xff0c;结果wifi列表中不显示任何的网络信息&#xff0c;这是怎么回事&#xff1f;要如何解决&#xff1f; 答&#xff1a;笔…

Go学习第四章——程序流程控制

Go学习第四章——程序流程控制 1 分支结构1.1 单分支1.2 双分支1.3 多分支1.4 switch分支 2 循环结构2.1 for循环2.2 while和dowhile的实现2.3 经典案例——打印金字塔2.4 经典案例——打印九九乘法表 3 跳转控制语句3.1 break3.2 continue3.3 goto3.4 return 流程控制的作用&a…

JavaSE入门---认识String类、学习String类的相关方法

文章目录 什么是String类&#xff1f;String类的常用方法字符串构造&#xff08;三种&#xff09;String对象的比较&#xff08;四种&#xff09;字符串查找转化数值和字符串转化大小写转化字符串和数组转化格式化 字符串替换字符串拆分字符串截取字符串的其他方法 字符串常量池…

SOLIDWORKS 2024新功能 3D CAD三维机械设计10大新功能

SOLIDWORKS 2024新增功能 - 3D CAD三维机械设计 10大新增功能 1. 先前版本的兼容性 •利用您订阅的 SOLIDWORKS&#xff0c;可将您的 SOLIDWORKS 设计作品保存为旧版本&#xff0c;与使用旧版本 SOLIDWORKS 的供应商无缝协作。 •可将零件、装配体和工程图保存为最新版本…

【CSS】常见 CSS 布局

1. 响应式布局 <!DOCTYPE html> <html><head><title>简单的响应式布局</title><style>/* 全局样式 */body {font-family: Arial, sans-serif;margin: 0;padding: 0;}/* 头部样式 */header {background-color: #333;color: #fff;padding: …

【C语言练习题】添加逗号

✨博客主页&#xff1a;小钱编程成长记 &#x1f388;博客专栏&#xff1a;C语言练习题 添加逗号 1. 题目2.讲解3.代码总结 1. 题目 牛客网在线OJ 2.讲解 因为数字位数可能不全是3的倍数&#xff0c;比如&#xff1a;23&#xff0c;445&#xff0c;555。所以我们从后向前进行&…

“我有一个大胆的想法”?Meta AI 新技术让你的思维图像一览无余!

夕小瑶科技说 原创 作者 | 付奶茶 大家之前是否想象过未来的技术进步会带来读脑器&#xff0c;计算界面是否有可能越过触摸屏、键盘进入我们思维内部读取我们脑袋中所想。尽管当前我们社会尚未达到这一阶段&#xff0c;但我们确实逐渐接近这一愿景&#xff01; 不久前&#x…

DDR电源硬件设计要点

一、DDR电源简介 1. 电源 DDR的电源可以分为三类: a、主电源VDD和VDDQ,主电源的要求是VDDQ=VDD,VDDQ是给IO buffer供电的电源,VDD是给但是一般的使用中都是把VDDQ和VDD合成一个电源使用。 有的芯片还有VDDL,是给DLL供电的,也和VDD使用同一电源即可。电源设计时,需要考…

【PyTorch】深度学习实践 02 线性模型

深度学习的准备过程 准备数据集选择模型模型训练进行推理预测 问题 对某种产品花费 x 个工时&#xff0c;即可得到 y 收益&#xff0c;现有 x 和 y 的对应表格如下&#xff1a; x &#xff08;hours&#xff09; y&#xff08;points&#xff09;12243648 求花费4个工时可得…

回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于BP-Adaboost的BP神经网络结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BP-Adaboost的BP…

C# 程序运行无法加载 C++ DLL“xxx.dll”: 找不到指定的模块 Exception from HRESULT: 0x8007007E

背景:由于公司需要集成期货公司的提供的DLL&#xff0c;在本地开发调试时运行正常&#xff0c;放到web服务器后运行提示找不到指定模块错误代码Exception from HRESULT: 0x8007007E 原因&#xff1a;可能是由于服务器的C:\Windows\SysWOW64系统文件夹下的模块有缺失。 排查 下载…

剑指Offer || 054.把二叉搜索树转换为累加树

题目 给定一个二叉搜索树&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件&#xff1a; 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也…

【FISCO-BCOS】十八、使用docker部署区块链

目录 前言&#xff1a; docker&#xff1a; 一、安装docker docker部署区块链&#xff1a; 一、 搭建单群组4节点区块链 二、启动区块链 三、检查容器 四. 查看节点 前言&#xff1a; 关于FISCOBCOS部署区块链的方式&#xff0c;我们已经学习过了很多种&#xff0c;如多群组部…

Java代理

一、代理模式 代理模式定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 上面类图中有一个订单接口类(OrderService)、一个订单实现类(OrderServiceImpl)&#xff0c;订单模块的业务相对复杂和重要&#xff0c;如果这时候要在方法执行前后加上日志&#xff0c…

三种字符串格式化方法(%、format、f-string)

一、使用 % name 第一帅 print(我是宇宙无敌天下%s % name) age 18 print(我是宇宙无敌天下%s&#xff0c;我今年%d岁%(name,age)) price 5.99print(白心火龙果单价是%.1f元一斤%price)二、使用 format 在字符串中&#xff0c;使用{ }进行占位&#xff0c;然后在字符串后…

关于编程生成的目标文件到底是怎么链接生成可执行文件的

以c/c程序为例&#xff0c;要想生成可执行文件&#xff0c;需要经过如下步骤&#xff1a; #mermaid-svg-u1JzuqIf7rGHTIIk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-u1JzuqIf7rGHTIIk .error-icon{fill:#55222…

SLAM从入门到精通(rviz自定义形状)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 rviz作为很好的上位机调试工具&#xff0c;它本身可以显示很多的传感器数据。比如说lidar、map、tf、camera、点云这些&#xff0c;在rviz上面显示…