【Redis】缓存|缓存的更新策略|内存淘汰策略|缓存预热、缓存穿透、缓存雪崩和缓存击穿

思维导图:


Redis最主要的用途,三个方面:

1.存储数据(内存数据库)

2.缓存(redis最常用的场景)

3.消息队列


一、什么是缓存

我们知道对于硬件的访问速度来说,通常情况下:

CPU寄存器 > 内存 > 硬盘 > 网络

速度快点设备,可以作为速度慢的设备的缓存  

最常见的就是使用 内存 作为 硬盘 的缓存(redis定位)

同样硬盘也可作为网络的缓存,比如浏览器的缓存,浏览器通过http/https从服务器上(网络)获取到数据(html,css,图片,视频,音频...)并进行展示,像图片这种比较大,又不太改变的数据,就可以保存到浏览器本地(浏览器所在的主机硬盘上),后续打开这个页面,就不必重新从网络获取上述数据了

🍞二八定律

20%的数据,可以应对80%的请求
因此只需要把这少量的热点数据缓存起来,就可以应对⼤多数场景,从⽽在整体上有明显的性能提升


二、使用Redis作为缓存

通常是使用redis作为数据库的缓存(mysql),因为数据库是非常重要的组件,并且mysql的速度又比较慢,所以可以使用redis作为mysql的缓存

🍞为什么关系型数据库性能不高?

(1)数据存储在硬盘上,硬盘IO速度很慢,尤其是随机访问

(2)如果查询不能命中索引,就需要全表变量

(3)对SQL执行会做一系列的解析,校验,优化工作

(4)如果是复杂查询,需要进行笛卡尔积操作,效率更低

1和2属于硬件,3和4属于软件,因为mysql等数据库,效率比较低,所以承担的并发量有限,一旦请求多了,数据库压力就很大,甚至就容易宕机了(服务器每次处理应一个请求,一定都要消耗一些硬件资源CPU,内存,硬盘这些,任意一种资源的消耗超出了机器能提供的上限,机器就很容易出现故障

如何提高mysql能承担的并发量?

(1)开源:引入更多的机器,构成数据库集群

(2)节流:引入缓存,把一些频繁读取的热点数据,保存到缓存上,后续在查询数据的时候,如果缓存中已经存在,就不用访问mysql了


三、📚缓存的更新策略

引入:如何知道redis中应该存哪些数据呢/如何知道哪些数据是热点数据呢

📚缓存的更新策略:

1.定期生成

怎么做:把访问的数据,以日志的形式记录下来,此处的数据,就可以根据当前这里统计的维度,来定期更新(比如按照天级别统计,就每天更新一次),写一套离线的流程(往往使用shell,python写脚本),可以通过定时任务来触发

eg:搜索引擎为例子

a)完成统计热词的过程

b)根据热词,找到搜索结果的数据(广告数据)

c)把得到的缓存数据同步到缓存服务器上

d)控制这些缓存服务器自动重启

优点:可控(缓存中有啥比较固定),方便排查问题

缺点:实时性不够,如果出现突发热点事件(比如:”春节晚会“这几天才会搜索),有一些本来不是热词的内容,变为了热词,新的热词就可能给后面的数据库带来较大的压力

2.实时生成

怎么做:

(1)如果在Redis查到了,就直接返回

(2)如果Redis中不存在,就数据库中查,把查到的结果同时也写入redis

存在的问题:经过一段时间的动态平衡,redis中的key就逐渐都成了热点数据,这样不同的写redis,就会使redis的内存占用越来越多,逐渐达到内存上限(这个上限可以配置的maxmemory参数设定),此时如果继续往里面插入数据,就会触发问题

解决:

📚内存淘汰策略

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

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

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

(4)Random 随机淘汰:从所有的 key 中抽取幸运⼉被随机淘汰掉

redis中有个配置,就可以设置redis采取上述哪种策略淘汰内存数据,具体采用哪种,结合实际场景来具体问题具体分析

其实还可以细分:针对设置了过期时间的key(设置了过期时间都算,包括过期时间还没到的)淘汰/在所有key中淘汰【FIFO没有针对所有key,因为可能对于一些没有设置过期时间的key,是没有保存设置时间的】


四、缓存预热、缓存穿透、缓存雪崩和缓存击穿

1.缓存预热(Cache preheating)

问题:缓存中的数据,是定期生成/实时生成的,对于定期生成这种情况是不涉及”预热“的,而对于实时生成,redis服务器首次接入之后,服务器里面是没有数据的。此时所有的请求都会打到mysql

解决:缓存预热就是来解决上述问题的,把定期生成 和 实时生成结合一下,先通过离线的方式,通过一些统计的途径,先把热点数据找到一批,导入到redis中,此时导入的这批热点数据,就能帮助mysql承担很大的压力了,随着时间的推移,逐渐就使用新的热点数据淘汰旧的数据


2.📚缓存穿透(Cache penetration)

是啥:

查询的某个key,在redis中没有,mysql也没有,这次查询没有,下次查也没有,如果这样的数据,存在很多,并且还反复查询,一样也会给mysql带来很大的压力

为何产生:

(1)业务设计不合理,比如缺少必要的参数校验环节,导致非法的key也被查询了【典型

(2)开发/运维误操作,不小心把部分数据从数据库上误删了

(3)黑客恶意攻击

解决:

(1)如果发现这个key,在redis和mysql都不存在,仍然写入redis,value值设为非法值(比如”“)

(2)引入布隆过滤器,每次查询redis/mysql之前都先判定一下key是否在布隆过滤器存在(把所有的key都插入到布隆过滤器中)

(3)通过改进业务/加强监控报警


3.📚缓存雪崩(Cache avalanche)

是啥:

由于在短时间内,redis上大规模的key失效,导致缓存命中陡然下降,并且mysql的压力迅速上升,甚至直接宕机

为何产生:

(1)redis直接挂了(redis宕机/redis集群环境下大量节点宕机)

(2)redis好着,但是可能之前短时间内设置了很多key给redis,并且设置的过期时间是相同的

解决:

(1)加强监控报警,加强redis集群可用性的保证

(2)不给key设置过期时间/设置过期时间的时候添加随机的因子(避免同一时刻过期


4.📚缓存击穿(Cache breakdown)

是啥:相当于缓存血崩的特殊情况,针对热点key,突然过期了,导致大量的请求直接访问到数据库上,甚至引起数据库宕机【热点key访问频率高,影响更大】

解决:

(1)基于统计的方式发现热点key,并设置永不过期

(2)服务降级(适当关闭一些不重要的功能,只保留核心功能),比如访问数据库的时候使⽤分布式锁,限制数据库的访问频率


 

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

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

相关文章

中阳视角下的趋势确认策略:以数据为核心的交易思维

中阳视角下的趋势确认策略:以数据为核心的交易思维 在动态交易市场中,如何在波动中捕捉相对确定的趋势,是每一位操作者关心的问题。“中阳”理念主张通过结构性价格分析,判断市场情绪的拐点。尤其是在出现大阳线或中阳线时&#x…

【C/C++】inline关键词

C inline 关键字学习笔记 一、什么是 inline 函数? inline(内联)是 C 中的一个关键字,表示“将函数的代码直接插入到调用点”,以减少函数调用开销,提升执行效率。 ✅ 注意:inline 是一种“请求…

React useMemo函数

第一个参数是回调函数,返回计算的结果,第二个参数是依赖项,该函数只监听count1变量的变化 import { useReducer, useState } from react; import ./App.css;// 定义一个Reducer函数 根据不同的action进行不同的状态修改 function reducer(st…

对比测评:为什么AI编程工具需要 Rules 能力?

通义灵码 Project Rules 在开始体验通义灵码 Project Rules 之前,我们先来简单了解一下什么是通义灵码 Project Rules? 大家都知道,在使用 AI 代码助手的时候,有时候生成的代码不是自己想要的,或者说生成的代码采纳后…

Java学习手册:MyBatis 框架作用详解

一、MyBatis 简介 MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发。它通过将 Java 对象与数据库表之间的映射关系进行配置,使得开发者可以使用简单的 SQL 语句和 Java 代码来完成复杂的数据操作。MyBatis 支持自定义 SQL 语句,提供了灵…

list的设计

#pragma once #include<assert.h> #include<iostream> using namespace std; namespace aqc {template<class T>struct list_node{list_node* _next;list_node* _prev;T _data;list_node(const T& xT())//加const防止权限放大&#xff0c;用引用减少拷贝…

基于 PyQt 的YOLO目标检测可视化界面+ nuitka 打包

在人工智能和计算机视觉领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果&#xff0c;我们使用Pyqt框架进行检测结果的可视化&#xff0c;同时为了使其能够脱离Python环境&#xff0c;我们…

2.1 阅读错题---02-04年

引言 2002年-2004年英语阅读错题汇总与分析总结。 一、02年阅读 Text 1 题目&#xff1a;21题 题型&#xff1a;细节题 原因&#xff1a;单词认错了&#xff0c;原句中 in sympathy with 译为 与…一致 &#xff1b;题干中的 sympathy 译为 同情 题目&#xff1a;22题 题…

Axure疑难杂症:中继器制作下拉菜单(多级中继器高级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 本文视频课程记录于上述地址第五章中继器专题第11节 课程主题:中继器制作下拉菜单 主要内容:创建条件选区、多级中继器…

即刻启程,踏上W55MH32高性能以太网单片机学习之路!

单芯片解决方案&#xff0c;开启全新体验——W55MH32 高性能以太网单片机 W55MH32是WIZnet重磅推出的高性能以太网单片机&#xff0c;它为用户带来前所未有的集成化体验。这颗芯片将强大的组件集于一身&#xff0c;具体来说&#xff0c;一颗W55MH32内置高性能Arm Cortex-M3核心…

C++负载均衡远程调用学习之上报功能与存储线程池

目录 1. Lars-reportV0.1 report模块介绍 2.Lars-reporterV0.1 reporter项目目录构建 3.Lars-ReporterV0.1 数据表和proto协议环境搭建 4.Lars-ReporterV0.1上报请求业务处理 5.Lars-ReporterV0.1上报请求模块的测试 6.Lars-ReporterV0.2开辟存储线程池-网络存储分离 1. L…

LabVIEW三轴电机控制

在工业自动化迅猛发展的当下&#xff0c;多轴伺服电机控制系统在制造业、3D 打印等众多领域的需求与日俱增。它不仅要实现高精度的单轴运动控制&#xff0c;还需保障多轴协同作业的精准度&#xff0c;对响应速度也有严格要求。LabVIEW 开发多轴伺服电机控制系统&#xff0c;有效…

驱动开发硬核特训 · Day 27(下篇):深入掌握 Common Clock Framework 架构与实战开发

节。 在本篇内容中&#xff0c;我们将围绕 Linux 内核中的时钟子系统核心架构 —— Common Clock Framework&#xff08;简称 CCF&#xff09;展开深入讲解&#xff0c;目标是帮助你全面理解其设计理念、主要数据结构、注册流程、驱动实现方式&#xff0c;以及如何基于 NXP i.M…

数据库基础:数据库类型与MySQL特点详解

一、数据库的主要类型 1. 关系型数据库(RDBMS) 特点:基于关系模型,数据以表格形式存储 代表产品:MySQL、Oracle、SQL Server、PostgreSQL 优势:ACID事务支持、强一致性、成熟的SQL标准 适用场景:需要复杂查询和事务支持的场景 2. 非关系型数据库(NoSQL) 文档型数据库:Mo…

49认知干货:产品的生命周期及类型汇总

49章:产品的生命周期与类型划分 宇宙是运动的而非静止的,任何事物亦是如此。只要是存在的事物,便必然存在周期性变化,就像四季更替中的冬日枯树、春日新芽、夏日繁茂与秋日凋零。 这也意味着:事物的发展,离不开周期的更迭与演化,死亡并非终点,而是一种新的循环转变。 …

【2025最新】为什么用ElasticSearch?和传统数据库MySQL与什么区别?

Elasticsearch 深度解析&#xff1a;从原理到实践 一、为什么选择 Elasticsearch&#xff1f; 数据模型 Elasticsearch 是基于文档的搜索引擎&#xff0c;它使用 JSON 文档来存储数据。在 Elasticsearch 中&#xff0c;相关的数据通常存储在同一个文档中&#xff0c;而不是分散…

Docker安装Gitblit(图文教程)

本章教程,使用Docker安装部署Gitblit。 一、Gitblit简介 Gitblit 是一个基于 Java 的 Git 仓库管理工具,主要用于在局域网或小型团队环境中搭建私有 Git 服务器。它提供了一个简单易用的 Web 界面,用于浏览代码、管理仓库和用户权限等。 二、拉取镜像 sudo docker pull git…

nDCG(归一化折损累计增益) 是衡量排序质量的指标,常用于搜索引擎或推荐系统

nDCG&#xff08;归一化折损累计增益&#xff09; 是衡量排序质量的指标&#xff0c;常用于搜索引擎或推荐系统。核心思想是&#xff1a;排名越靠前的高质量结果&#xff0c;对整体评分的贡献越大&#xff0c;但后续结果的贡献会逐渐“打折”。最终通过对比实际排序与理想排序的…

《从线性到二维:CSS Grid与Flex的布局范式革命与差异解析》

在前端开发的广袤宇宙中&#xff0c;CSS布局技术宛如闪耀的星辰&#xff0c;不断革新与演进&#xff0c;为构建绚丽多彩的网页世界提供了坚实的支撑。其中&#xff0c;CSS Grid布局与Flex布局作为两颗璀璨的明星&#xff0c;以其独特的魅力和强大的功能&#xff0c;深受开发者们…

2025年01月03日美蜥(杭州普瑞兼职)一面

目录 vue2 vue3 的区别react 性能优化react 组件传值v-for 和 v-if 的优先级react 中多个接口请求的数据&#xff0c;需要渲染到一个列表上怎么处理百万条数据怎么渲染vue2、vue3 的响应式原理微前端了解吗git 版本控制git mearge 和 git rebase 的区别垂直水平居中react 中实…