Redis - 缓存

news2024/12/29 8:14:51

文章目录

目录

文章目录

1. 什么是缓存?

2. 使用Redis作为缓存

2.1 关系型数据库的缺点

3. 缓存的更新策略

3.1 定期生成

3.2 实时生成

缓存淘汰策略

4. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿

缓存预热

缓存穿透

缓存雪崩

缓存击穿

总结


1. 什么是缓存?

缓存 (cache) 是计算机中的一个经典的概念. 在很多场景中都会涉及到. 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方, 方便随时读取。

对于计算机硬件来说,往往访问速度越快的设备,成本越高,存储空间越小。

缓存是很快,但是空间上往往不足以存储所有数据, 因此大部分时候, 缓存只存放一些热点数据。

二八定律

20%的热点数据,能够应对80%的访问场景。

因此只需要把这少量的热点数据缓存起来,就可以应对大多数场景,从而在整体上有明显的性能提升。

2. 使用Redis作为缓存

2.1 关系型数据库的缺点

在一个网站中,我们常常会使用Mysql这类关系型数据库来存储数据。关系型数据库虽然功能强大,但是有一个非常严重的缺点: 性能不高

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

遵从二八定律,我们可以使用Redis作为缓存层,这样打到Mysql数据库的请求就会少很多,降低了数据库的压力,同时提高了总体响应速度。

缓存是用来加快 "读操作" 的速度的. 如果是 "写操作", 还是要老老实实写数据库, 缓存并不能提高其性能.

3. 缓存的更新策略

3.1 定期生成

每隔一定的周期(比如⼀天/⼀周/⼀个月), 对于访问的数据频次进行统计. 挑选出访问频次最高的前 N% 的数据保存进入Redis。

这种做法实时性较低. 对于一些突然情况应对的并不好。

比如春节期间, "春晚" 这样的词就会成为非常高频的词. 而平时则很少会有人搜索 "春晚"。

3.2 实时生成

先给缓存设定容量上限(可以通过 Redis 配置文件的 maxmemory 参数设定)。

接下来把用户每次查询:

  • 如果在 Redis 查到了, 就直接返回。
  • 如果 Redis 中不存在, 就从数据库查, 把查到的结果同时也写入 Redis。

如果缓存已经满了(达到上限), 就触发缓存淘汰策略, 把一些 "相对不那么热门" 的数据淘汰掉。

按照上述过程, 持续一段时间之后 Redis 内部的数据自然就是 "热门数据" 了。

缓存淘汰策略

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

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

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

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

4. 缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿

缓存预热

缓存预热是指在系统上线或流量高峰之前,主动将一些常用的数据预先加载到缓存中,以减少首次请求时的延迟和数据库的压力。


缓存穿透

缓存穿透是指请求的数据在缓存和数据库中都不存在,导致每次请求都直接访问数据库,造成数据库压力增大。通常是由于恶意请求或错误的请求参数引起的。

原因:

业务设计不合理。比如缺少必要的参数校验环节, 导致非法的 key 也被进行查询了。

黑客恶意攻击。

解决:

1. 针对要查询的参数进行严格的合法性校验。 比如要查询的 key 是用户的手机号, 那么就需要校验当前 key 是否满足⼀个合法的手机号的格式。

2. 针对数据库上也不存在的 key , 也存储到 Redis 中, 比如 value 就随便设成⼀个 "". 避免后续频繁访问数据库.

3. 使用布隆过滤器先判定 key 是否存在, 再真正查询.


缓存雪崩

缓存雪崩是指在某个时间点,大量缓存数据同时过期,导致大量请求直接访问数据库,造成数据库瞬间负载过高,可能导致服务崩溃。

原因:

Redis挂了。

Redis中大量key同时过期。

解决:

1. 部署高可用的 Redis 集群, 并且完善监控报警体系。

2. 不给 key 设置过期时间 或者 设置过期时间的时候添加随机时间因子。 


缓存击穿

缓存击穿是指某个热点数据在缓存中失效,导致大量请求同时访问数据库,造成数据库瞬间负载过高。与缓存雪崩不同的是,缓存击穿通常是针对单个热点数据的情况。

解决:

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

2. 进行必要的服务降级. 例如访问数据库的时候使用分布式锁, 限制同时请求数据库的并发数。


总结

以上就是这篇博客的主要内容了,大家多多理解,下一篇博客见!

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

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

相关文章

Web安全之XSS跨站脚本攻击:如何预防及解决

1. 什么是XSS注入 XSS(跨站脚本攻击,Cross-Site Scripting)是一种常见的Web安全漏洞,通过注入恶意代码(通常是JavaScript)到目标网站的网页中,以此在用户浏览网页时执行。攻击者可以通过XSS获取…

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩

特征值分解(EVD)和奇异值分解(SVD)—应用于图片压缩 目录 前言 一、特征值分解 二、应用特征值分解对图片进行压缩 三、矩阵的奇异值分解 四、应用奇异值分解对图片进行压缩 五、MATLAB仿真代码 前言 学习了特征值分解和奇异值分解相关知识,发现其可以用于图片…

初次使用住宅代理有哪些常见误区?

随着网络技术的发展,住宅代理因其高匿名性和稳定性成为许多用户进行网络活动的首选工具。然而,对于新手而言,使用住宅代理时往往容易陷入一些误区,这不仅可能影响使用效果,还可能带来安全风险。本文将探讨新手在使用住…

我与Linux的爱恋:yum和vim以及gcc的使用

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 文章目录 ​1.Linux软件包管理器yum2.Linux开发工具3.Linux编译器 vimvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集vim操作总结批量化注释批量化去注释简…

【数据库中级】1_DBeaver操作数据库

文章目录 一、连接数据库1.1 命令行连接数据库1.2 DBeaver工具连接数据库 二、DBeaver操作数据库2.1 通过DBeaver操作数据库2.2 通过DBeaver操作表2.3 通过DBeaver操作数据 三、DBeaver界面3.1 SQL编辑区3.2 导航区3.3 修改字体大小 一、连接数据库 1.1 命令行连接数据库 命令…

《Learning to Count without Annotations》CVPR2024

摘要 论文提出了一种名为UnCounTR的模型,该模型能够在没有任何手动标注的情况下学习进行基于参考的对象计数。这是通过构建“Self-Collages”(自我拼贴画)实现的,即在背景图像上粘贴不同对象的图像作为训练样本,提供覆…

【Git 学习笔记_24】Git 实用冷门操作技巧(四)—— 更多实用 git 别名设置、交互式新增提交

文章目录 11.8 更多别名设置别名1:只查看当前分支(git b)别名2:以图表形式显示自定义格式的 git 日志(git graph)别名3:查看由于合并分支导致的冲突后仍有冲突的、待合并的文件列表(…

Excel文档的读取(1)

熟悉使用Excel的同学应该都知道,在单个Excel表格里想要分商品计算总销售额,使用数据透视表也可以非常快速方便的获得结果。但当有非常大量的Excel文件需要处理时,每一个Excel文件单独去做数据透视也会消耗大量的时间。就算使用Power Query这样…

python容器3——字典

(1) 什么是字典 字典:python中使用关键字dict表示 字典中允许通过key:value键值对的方式存储数据,让数据的管理更加友好! 如图: 字典是一个哈希结构 (传入一个值算出内存地址,将该值保存在该…

产品经理就业

供需关系 1.需求分析核心价值是? 将真实的用户需求分析得到与之匹配的产品方案(功能) 2.Y模型的主要内容及其侧重点? 1)用户需求、2)目标动机、3)产品功能、4)人性(马斯洛需求) 1-2-4侧重深入想清楚需求本质 Why、4 -2-3 侧重浅出 How 结果输出 3.可以从哪些角度做好需求分析…

java.lang.IndexOutOfBoundsException: setSpan ( 0...x ) ends beyond length X

1,可能是EditText,setSelection(x)时超过了 输入框内容的实际长度导致的。 2,手机开启“拼写检查功能”,EditText设置了最大长度,选择提示的某一项文案时超过设置的最大长度限制,导致崩溃。 针对情况2 开…

【电子通识】洁净度等级划分及等级标准

洁净度常用于评估半导体、生物制药、医疗、实验室及科研院所、新能源等领域的洁净室、无尘室或者无菌室等环境。 一般来说,晶圆光刻、制造、测试等级为100级或1000级的洁净间,百级洁净间要求空气中0.5微米的尘埃粒子数不得超过每立方米3520个&#xff1b…

移动UI:新手指引页面,跟着指引不迷路。

移动端新手指引在提供用户引导、提升用户体验、提高用户留存率、促进功能使用和降低用户流失率方面都有积极的作用。 移动端新手指引在应用程序或移动网站中有以下几个作用: 1. 提供用户引导: 新手指引可以帮助用户快速了解应用程序或移动网站的功能和…

【网络安全】Exif 数据储存型XSS

未经许可,不得转载。 文章目录 Exif步骤Exif EXIF(Exchangeable Image File Format)数据是一种存储在图像文件中的元数据格式,常用于数码照片和扫描图像。它包含了与图像相关的各种信息,比如拍摄日期和时间、相机品牌和型号、拍摄时的设置(如曝光时间、光圈、ISO等)、地…

输送线相机拍照信号触发(博途PLC高速计数器中断立即输出应用)

博途PLC相关中断应用请参考下面文章链接: T法测速功能块 T法测速功能块(博途PLC上升沿中断应用)-CSDN博客文章浏览阅读165次。本文介绍了博途PLC中T法测速的原理和应用,包括如何开启上升沿中断、配置中断以及T法测速功能块的使用。重点讲述了在中断事件发生后执行的功能块处…

dp算法练习【6】

最长公共子序列 1143. 最长公共子序列 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序…

被审稿人批得体无完肤?参考文献这样引用就对了!

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 审稿人对参考文献引用提出质疑,在comments中还挺常见的。一般来说,是最新的、相关的、重要的文献引用缺失。此外,如果仔细分析引文来源&…

QT定时器QObiect/QTimer

QT定时器 一、QObiect: startTimer ----------- killTimer 电子相册,利用定时器轮播图片 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);picID …

【自动驾驶】控制算法(八)横向控制Ⅱ | Carsim 与 Matlab 联合仿真基本操作

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

[SWPUCTF 2021 新生赛]web方向(一到六题) 解题思路,实操解析,解题软件使用,解题方法教程

题目来源 NSSCTF | 在线CTF平台因为热爱,所以长远!NSSCTF平台秉承着开放、自由、共享的精神,欢迎每一个CTFer使用。https://www.nssctf.cn/problem [SWPUCTF 2021 新生赛]gift_F12 这个题目简单打开后是一个网页 我们一般按F12或者是右键查…