Redis 全景图(3)--- Redis 应用于缓存

前言

这是关于 Redis 全景图的最后一篇文章。因为一次写太多会限流,我也是没办法,才分成三篇文章来写。这篇文章是关于 Redis 应用于缓存的。

其实为什么要讲这个话题呢? Redis 应用在很多地方呀,为什么一定要挑着这个话题来讲呢?我刚开始接触 Redis 的时候,对 Redis 的很多知识都不熟悉,但是Redis又经常用于缓存,所以我就把Redis 和缓存搞混了。我以为 Redis 就是缓存,缓存就是 Redis。然后我背了好多知识,什么缓存与数据库不一致,什么缓存雪崩缓存穿透这些,都是关于 Redis 的,所以我当时就认为缓存是Redis。那个时候,我一直建立不起系统观,不能对 Redis 和缓存这两个知识点高山看海。后来我看了好多文章,然后通过文章来对自己脑里的知识做梳理总结后,才明白这两者的区别。所以我特意写一篇文章来讲讲 Redis 应用于缓存这个场景。

缓存的两个特征

要讲 Redis 应用于缓存,那我们就先来讲缓存,再讲 Redis。因为我们最终要解决的问题是为什么Redis 可以应用于缓存?kafka 为什么不可以应用于缓存?zookeepeer 为什么不可以?为什么就Redis 可以?

缓存是用来放一些热点数据,加快查询速度的,所以缓存有两大特征:缓存是一个快速的系统,而且缓存的容量小于后端的慢速系统。

缓存在 CPU 和内存中都存在,但是 Redis 应用于内存的缓存,不应用于CPU的缓存。

Redis用于缓存的两大天然优势

上面说了,缓存的一大特点就是快,那 Redis 刚好适合,Redis 很快。同时,Redis 还有专属的数据淘汰机制,使得 Redis 保存的数据会比较少,刚好符合缓存容量小于后端的慢速系统这个特点。

引入缓存的4个问题

这几乎是缓存中最难理解的地方了。这个地方的知识点多而且杂,还不好理解。不过假如你建立了系统观的话也还好,至少回忆起来会快一点。

缓存雪崩

Tomcat 一般是先访问缓存再访问数据库的。但是,假如缓存中数据在某一时刻同时过期,那大量的并发请求就会越过缓存直接走数据库,数据库压力剧增,这就是缓存雪崩。解决方法是给缓存中的数据的过期时间设一个随机值。

缓存穿透

Tomcat 故意大量请求缓存中没有的数据,导致请求走数据库,并发时压力剧增。解决方法是在Dao 层就拦截这种非法请求。

缓存与数据库不一致

说实话,这个是真的烧脑,就很难受,我一直搞不懂这里,因为这里确实很复杂。我尽量将我能理解的写出来......

其实对数据的操作无非就是“读”和“写”。“读”不会造成缓存与数据库不一致的问题,但是“写”就会。“写”其实就是更新的意思,那无论我们先更新数据库再同步给缓存,还是先更新缓存再同步给数据库,我们都想保证这些操作的原子性。假如第一步更新失败了,那就失败呗,没什么大不了的。但是假如第一步更新成功了,第二步更新失败了,那就会造成缓存与数据库不一致的问题(即缓存中的值是新值而数据库中的值是旧值;也有可能缓存中的值是旧值而数据库中的值是新值)。因此更新数据库和更新缓存这个操作不太好。

那我们换一种思路,数据库是必须要更新的,但是缓存不一定需要更新,所以我们能否考虑删除缓存,一了百了呢?我了解到的答案是可以的。先删除缓存再更新数据库,在高并发下不太OK,但是在原子性被破坏的情况下表现很OK。先更新数据库再删除缓存,在高并发下很OK,但在原子性被破坏时不太OK。

缓存数据淘汰策略

因为缓存比较少,没有磁盘那么大,所以不可避免的,过一段时间就要对缓存的数据进行淘汰。而Redis 有自己的数据淘汰策略,所以很适合用作缓存。下面我就来介绍一下 Redis 的数据淘汰策略。

假如你添加了一批键值对,设置了一小时的过期时间。一小时后,这批数据已经全部过期了,你想要删除这些键值对,怎么办?可以采用定期删除策略,即每过100ms就随机抽取一些设置了过期时间的键值对,过期就删除。但是由于是随机的,所以很可能漏掉了一些键值对,因此我们可以采用惰性删除。惰性删除就是你要使用的时候看看键值对是不是过期的,过期就顺便删掉。

但是问题是定期删除+惰性删除也不一定可以保证所有过期数据都被删除,有些数据你随机抽取,抽取不到,而你又一直不适用这些抽取不到的数据,导致这些数据积压在 Redis 中。所以引入了一种技术:通过内存淘汰机制来淘汰键值对。内存淘汰机制的算法有很多,我觉得用的最多的是LRU算法。

小结

在这篇文章中我讲了 Redis 应用于缓存。我先讲了缓存的两个特征,为接下来解答为什么 Redis 可以应用于缓存做铺垫。接着我又讲了引入缓存所遇到的4个问题:缓存雪崩、缓存穿透、缓存与数据库不一致、缓存怎么淘汰数据。

感想

这是我第一次以这种方式来写文章,通过一篇文章(其实是三篇)将我脑子里的 Redis 全景图描绘出来。在这几天的学习中,我的收获还是挺大的,倒不是我学习了很多 Redis 的新知识,当然学习到新知识只是一方面,更重要的是我深刻的理解了建立系统观的重要性。如果没有系统观,我学到的知识仅仅只是几个点,构建不成一个面。这样就会导致我有可能学了很多知识,但是却不知道如何讲起。而且,当我有了系统观,将 Redis 中的各个知识以一个思路串联在一起后,我感觉我对Redis 的很多知识的具体细节又有了新的理解。

那怎么才能建立系统观呢?我个人觉得是看一些优质的技术文章,通过一些优质的文章或者书籍来引导你去思考。最好不要看视频,因为看视频的话你是无法思考的,看视频算是一个接受的过程,没有思考的过程。说到书籍,我有时会去图书馆看很多技术书,但是我不是一整本书全部看完。比如说我看《Redis原理剖析》,我不会一整本看完,而是以一种高山看海的角度去看看这个作者到底是以一种什么样的角度去写 Redis 的,从而去推测出这个作者脑子的 Redis 思维导图,他脑子里的 Redis 总体框架是怎么样的,我能否借鉴一下作者脑子的框架,形成一个属于我自己的 Redis 全景图。这是我觉得形成系统观最重要的一点。接下来,我会继续尝试用这种方式写第二篇长文,第二篇长文的主题是 MySQL。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

帝国CMS模板源码整站安装说明(图文)

安装步骤 第一步:先把得到的文件解压缩,把文件通过FTP传到空间里。(请不要把类似www.lengleng.net这个文件夹传到FTP,请传这个大文件夹下面的所有文件夹和文件到空间根目录,请不要上传到2级目录,除非你自己…

代码随想录算法训练营第二十三天| 669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

系列文章目录 目录 系列文章目录669. 修剪二叉搜索树①递归法②迭代法(不好想出,掌握递归即可) 108.将有序数组转换为二叉搜索树递归法[左闭右开)[左闭右闭] 538.把二叉搜索树转换为累加树①递归法-反中序遍历(右中左)…

蓝桥杯练习笔记(十七)

蓝桥杯练习笔记(十七) 一、 输入样例 7 7 1000001 0100010 0010100 0001AAA 00010A0 00010A0 00010A0蓝桥官网题解: 该题解是用了三个循环分别对三个方向的相同字符的长度进行统计,找出最大长度,最后对找出的最长Y进…

五、企业级架构之Nginx负载均衡

一、负载均衡技术 1、介绍: 负载均衡技术(Load Balance)是一种概念,其原理就是把分发流量、请求到不同的服务器,平均分配用户请求。 2、作用: ① 流量分发,请求平均,提高系统处理…

【SQL Server的详细使用教程】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Free MyBatis Tool插件的进阶使用指南(消灭dao层的繁琐编码)

目录 零、起因一、怎么使用Free MyBatis Tool插件?1 基本使用2 进阶使用(搞清楚Options的用法)2.1 概览2.2 详述2.2.0 Options(一项都不勾选)2.2.1 Use-Lombok【消除UserDO中的getter和setter代码】2.2.2 Comment&…

《QT实用小工具·十二》邮件批量发送工具

1、概述 源码放在文章末尾 该项目实现了邮件的批量发送&#xff0c;如下图所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef SMTPCLIENT_H #define SMTPCLIENT_H#include <QtGui> #include <QtNetwork> #if (QT_VERSION > QT_VERSION_CHECK(5,0,…

.kat6.l6st6r勒索病毒肆虐,这些应对策略或许能帮到你

引言&#xff1a; 近年来&#xff0c;网络安全问题日益凸显&#xff0c;其中勒索病毒更是成为了公众关注的焦点。其中&#xff0c;.kat6.l6st6r勒索病毒以其独特的传播方式和破坏力&#xff0c;给全球用户带来了极大的困扰。本文将深入探讨.kat6.l6st6r勒索病毒的特点&#xf…

DIY蓝牙键盘(1) - 理解 键盘报文(免费)

DIY蓝牙键盘(1) - 理解键盘报文 1. 键盘报文体验 一个键盘对于用户的体验是&#xff0c;用户按按键A他能看到字母A会在主机上显示出来。那这是如何实现的&#xff1f; 其实很简单&#xff0c;只要键盘发送下面的两个报文给主机&#xff0c;字母A就能在主机上显示出来。 (1)…

深入理解C/C++的内存管理

在C和C中&#xff0c;高效的内存管理是编写性能优化和资源高效利用程序的关键。本文将深入探讨C/C内存管理的各个方面&#xff0c;包括内存的分布、C语言和C中的动态内存管理方式&#xff0c;以及new和delete操作符的使用 C/C内存分布 C和C程序的内存可以分为以下几个区域&…

MySQL安装卸载-合

目录 1.Linux下安装 1.1下载 1.2.上传 ​​​​​​​1.3.解压 ​​​​​​​1.4.安装 ​​​​​​​1.5.启动服务 ​​​​​​​1.6.查询临时密码 ​​​​​​​1.7.修改临时密码 ​​​​​​​1.8.创建用户 ​​​​​​​1.9.分配权限 ​​​​​​​1.10.重…

00-JAVA基础-脚本引擎

JAVA脚本引擎 什么是JAVA脚本引擎 Java 平台自带了如JavaScript、Groovy等脚本语言的引擎&#xff0c;可以在运行时动态地加载和执行脚本代码。这些脚本引擎可以直接在Java应用程序中使用&#xff0c;例如&#xff0c;通过ScriptEngineManager来获取特定脚本语言的ScriptEngi…

第18讲:数据在内存中的存储

⽬录 1. 整数在内存中的存储 2. ⼤⼩端字节序和字节序判断 3. 浮点数在内存中的存储 ——————————————————————————————————————————— 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#x…

如何保持数据一致性

如何保持数据一致性 数据库和缓存&#xff08;比如&#xff1a;redis&#xff09;双写数据一致性问题&#xff0c;是一个跟开发语言无关的公共问题。尤其在高并发的场景下&#xff0c;这个问题变得更加严重。 问题描述&#xff1a; 1.在高并发的场景中&#xff0c;针对同一个…

VC++建立空文档失败的一种情形

假设现在要在单文档程序的客户区创建控件; 把控件作为视类的成员变量; 先把成员变量定义加到视类头文件; 然后在视类的, BOOL CMyttView::PreCreateWindow(CREATESTRUCT& cs) {....... } 在此成员函数中创建控件; 运行程序,就会出现如下错误, 这就需要在类向导…

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》 2022-05-17 11:06 先看下带透明的特效素材效果1、首先在项目设置里搜索alpha&#xff0c;在后期处理标签设置最后一项allow through tonemapper2、在插件管理器中&#xff0c;搜索movie render &#xff0c;加载movie render q…

《QT实用小工具·十一》Echart图表JS交互之仪表盘

1、概述 源码放在文章末尾 该项目为Echart图表JS交互之炫酷的仪表盘&#xff0c;可以用鼠标实时改变仪表盘的读数。 下面为demo演示&#xff1a; 该项目部分代码如下&#xff1a; #include "widget.h" #include "ui_widget.h" #include "qurl.h&q…

UE小:UE5.3无法创建C++工程

当您在使用Unreal Engine (UE) 构建项目时&#xff0c;如果遇到以下问题&#xff1a; Running C:/Program Files/Epic Games/UE\_5.3/Engine/Build/BatchFiles/Build.bat -projectfiles -project"C:/UEProject/Shp\_1/Shp\_1.uproject" -game -rocket -progress Usi…

Vuex的模块化管理

1&#xff1a;定义一个单独的模块。由于mutation的第二个参数只能提交一个对象&#xff0c;所以这里的ThisLog是个json串。 2&#xff1a;在Vuex中的Store.js中引入该模块 3&#xff1a;在别的组件中通过...mapState调用模块保存的State的值。 4&#xff1a;用...mapMutations修…

界面控件Kendo UI for jQuery 2024 Q1亮点 - 新的ToggleButton组件

Telerik & Kendo UI 2024 Q1 版本于2024年初发布&#xff0c;在此版本中将AI集成到了UI组件中&#xff0c;在整个产品组合中引入AI Prompt组件以及10多个新的UI控件、支持Angular 17、多个数据可视化功能增强等。 P.S&#xff1a;Kendo UI for jQuery提供了在短时间内构建…