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

目录

一, 缓存

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.rhkb.cn/news/167568.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图论03-【无权无向】-图的深度优先DFS遍历-路径问题/检测环/二分图

文章目录 1. 代码仓库2. 单源路径2.1 思路2.2 主要代码 3. 所有点对路径3.1 思路3.2 主要代码 4. 路径问题的优化-提前结束递归4.1 思路4.2 主要代码 5. 检测环5.1 思路5.2 主要代码 6. 二分图6.1 思路6.2 主要代码6.2.1 遍历每个联通分量6.2.2 递归判断相邻两点的颜色是否一致…

概念解析 | 毫米波雷达与计算机视觉的融合

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:毫米波雷达与计算机视觉的融合。 毫米波雷达与计算机视觉的融合 Sensors | Free Full-Text | MmWave Radar and Vision Fusion for Object Detection in Autonomous Driving: A …

最详细STM32,cubeMX串口发送,接收数据

这篇文章将详细介绍 串口 发送数据,接受数据。 文章目录 前言一、串口的基础知识二、cubeMX 配置三、自动生成代码解析四、串口发送数据函数五、使用串口收发数据点亮 led重定向函数: 总结 前言 实验开发板:STM32F103C8T6。所需软件&#xf…

pycharm操作git、前后端项目上传到gitee

pycharm操作git 之前用命令做的所有操作,使用pychrm点点就可以完成 克隆代码 上方工具栏Git ⇢ \dashrightarrow ⇢ Clone ⇢ \dashrightarrow ⇢ 填写地址(http、ssh) 提交到暂存区,提交到版本库,推送到远程 直接…

rust学习——函数返回值

概念 Rust 中的函数定义以 fn 开始,后跟着函数名和一对圆括号。大括号告诉编译器函数体在哪里开始和结束。 特殊的地方——函数返回值 错误的写法 正解1 去掉分号 fn main() {let x plus_one(5);println!("The value of x is: {}", x); }fn plus_…

【小白专用 已验证】PHP连接SQLServer数据库

PHP是一门强大的服务器端脚本语言,而SQL Server是Microsoft开发的一款关系型数据库管理系统。为了在PHP中直接操纵SQL Server数据库,需要通过安装SQL Server扩展来实现。这篇文章将详细介绍如何在PHP中使用SQL Server扩展来操作数据库。 首先&#xff0…

linux/kali2023.1工具集合()

1 系统硬件信息查询 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /p…

使用 Rust 和 cURL 库下载程序

以下是一个使用 Rust 和 cURL 库的下载器程序,用于下载 图像。此程序使用了 https://www.duoip.cn/get_proxy 的代码。 extern crate curl; ​ use std::io::{self, Read}; use std::error::Error; ​ fn main() {let url "https://www.baidu.com";let …

Access,Trunk,Hybrid的一些接触知识以及实验

VLAN基本配置 一、实验目的 1.掌握VLAN基础配置原理; 2.掌握Access接口工作原理及配置; 3.掌握Trunk接口工作原理及配置; 4.掌握Hybrid接口工作原理及配置。 二、实验设备 1.电脑1台; 2.ENSP仿真软件。 三、实验内容及步骤 VLAN( …

论文阅读:Efficient Point Cloud Segmentation with Geometry-Aware Sparse Networks

来源:ECCV2022 链接:Efficient Point Cloud Segmentation with Geometry-Aware Sparse Networks | SpringerLink 0、Abstract 在点云学习中,稀疏性和几何性是两个核心特性。近年来,为了提高点云语义分割的性能,人们提…

【网络编程】应用层——HTTP协议

文章目录 一、HTTP协议简介二、认识URL三、HTTP协议格式1. HTTP请求协议格式2. HTTP响应协议格式 三、构建HTTP请求和响应四、HTTP的方法五、HTTP的状态码六、HTTP常见的Header七、Cookie和Session 一、HTTP协议简介 HTTP 协议 是 Hyper Text Transfer Protocol(超文…

给Windows文件夹添加备注信息

自己的电脑中文件夹为了安装各种开发环境,基本都是英文字母命名,就导致好多东西猛地一看找不着。此时加个备注会不会就好很多呢?就如以下这种 设置方法: 1、展示备注 右键展示的列表头部,会出现展示项,一…

AD9371 官方例程HDL详解之JESD204B TX_CLK生成 (二)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…

Metabase:简单快捷的商业智能与数据分析工具 | 开源日报 No.61

moby/moby Stars: 66.8k License: Apache-2.0 Moby 是一个由 Docker 创建的开源项目,旨在实现和加速软件容器化。它提供了工具包组件的“乐高集”,可以将它们组装成基于容器的自定义系统的框架。组件包括容器生成工具、容器注册表、业务流程工具、运行时…

折半搜索-oier复健练习题目

算法介绍: 折半搜索常用于复杂度O(n!)级的搜索问题,当我们发现很显然可以将问题划分为两部分分别搜索枚举,再合二为一求出最终答案时,我们可以选择使用折半搜索。 常见数据规模: 对于答案的值域往往没有要求&#x…

39.克鲁斯卡尔(Kruskal)算法

一言 已知n个顶点,选n-1条最短的边,不可成环。 概述 克鲁斯卡尔(Kruskal)算法是用来求加权连通图的最小生成树的算法。其基本思想是按照权值从小到大的顺序选择n-1条边,保证这n-1条边不构成回路。 这就要求要首先构…

位操作符^以及正负数在计算机中的存储

(数据是怎么在计算机中存储的)​ 正数和负数在内存中都是以补码的形式存储的,但不同的是正数的原码,补码,反码都是相同的,而负数的原码,补码和反码是不同的。 负数的原码,补码,反码之间存在什么…

git创建与合并分支

文章目录 创建与合并分支分支管理的概念实际操作 解决冲突分支管理策略Bug分支Feature分支多人协作 创建与合并分支 分支管理的概念 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码&#xf…

详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题

本文中将详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题,结合给出的带约束的最优化问题示例,给出相应的完整的C程序,并给出详细的解释和注释,以及编译规则等 一、Ipopt库的安装和测试 本部分内容在之前的文章《Ubuntu2…

在Windows下Edge浏览器OA发起流程问题

在Edge浏览器中发起流程 如上图所示,不能正常打开Excel,自动将Excel表格转为了PDF 怎么处理?还得使用IE浏览器来访问,但打开IE后又自动跳转到Edge,根本就不给使用,在Edge下使用IE模式也解决不了这个问题。…