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。

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

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

相关文章

日常生活中使用的 4 个核心开发工具

长话短说 本文列出了 2024 年我作为开发人员在日常生活中最常用的 4 个工具。✅ 这些工具旨在提高您的编辑技能、终端导航、笔记以及在应用程序容器化之外使用 Docker。另外,最后我还给大家准备了一个小惊喜。 如果您没有使用本文中至少提到的 1-2 个工具&#xf…

JavaSE-10笔记【多线程1(+2024新)】

文章目录 1.进程与线程2.并发与并行3.线程的调度模型4.实现线程4.1 第一种方式:继承Thread4.2 第二种方式:实现Runnable接口4.3 t.start()和t.run()的本质区别?4.4 线程常用的三个方法 5.线程的生命周期(把生命周期图背会&#xf…

redis事务(redis features)

redis支持事务,也就是可以在一次请求中执行多个命令。redis中的事务主要是通过MULTI和EXEC这两个命令来实现的。 MULTI命令用来开启一个事务,事务开启之后,所有的命令就都会被放入到一个队列中,最后通过一个EXEC命令来执行事务中…

jsp实现增删改查——(三)用Echarts图表统计学生信息

学生信息CRUD——Echarts显示生活费 目录结构 创建一个js文件夹,将echarts.min.js放到里面。 功能实现 与之前我们写的jsp文件(含有html代码、Java代码)不同的是,实现Echarts对生活费的显示,需要调用echarts.min.js…

OpenHarmony实战:CMake方式组织编译的库移植

以double-conversion库为例,其移植过程如下文所示。 源码获取 从仓库获取double-conversion源码,其目录结构如下表: 表1 源码目录结构 名称描述double-conversion/cmake/CMake组织编译使用到的模板double-conversion/double-conversion/源…

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

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

C++核心编程——4.2(2)对象的初始化和清理

4.2.5 深拷贝与浅拷贝 浅拷贝&#xff1a;编译器提供的简单的赋值拷贝操作 深拷贝&#xff1a;在堆区重新申请空间&#xff0c;进行拷贝操作 示例&#xff1a; class Person { public://无参&#xff08;默认&#xff09;构造函数Person() {cout << "无参构造函数…

基于Uni-app的体育场馆预约系统的设计与实现

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

电商技术揭秘六:前端技术与用户体验优化

文章目录 引言一、前端技术在电商中的重要性1.1 前端技术概述1.2 用户体验与前端技术的关系 二、响应式设计与移动优化2.1 响应式设计的原则2.2 移动设备优化策略2.3 响应式设计的工具和框架 三、交互设计与用户体验提升3.1 交互设计的重要性3.2 用户体验的量化与优化3.3 通过前…

asf是什么格式的文件?用手机怎么打开?

由于手机操作系统和硬件的限制&#xff0c;大部分手机并不直接支持asf文件的播放。因此&#xff0c;如果你想在手机上打开asf文件&#xff0c;你可能需要先将文件转换为手机支持的格式&#xff0c;如MP4。可以通过使用一些视频转换软件来实现&#xff0c;比如野葱视频转换器。 …

RuoYi-Vue若依框架-集成mybatis-plus报错Unknown column ‘search_value‘ in ‘field list‘

报错信息 ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column search_value in field list ### The error may exist in com/ruoyi/sales/mapper/ZcSpecificationsMapper.java (best guess) ### The error may involve defaultParameter…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号集思录近6000篇历史文章在线查看,找文章方便了

关于公众号文章批量下载&#xff0c;我之前写过很多文章&#xff1a; 视频更新版&#xff1a;批量下载公众号文章内容/话题/图片/封面/音频/视频&#xff0c;导出html&#xff0c;pdf&#xff0c;excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

go: go.mod file not found in current directory or any parent directory.如何解决?

这个错误表明你正在执行 go get 命令&#xff0c;但是当前目录或任何父目录中都找不到 go.mod 文件。这可能是因为你的项目还没有使用 Go Modules 进行管理。 要解决这个问题&#xff0c;有几种方法&#xff1a; go mod init <module-name> 其中 <module-name>…

构建第一个ArkTS应用(Stage模型)

创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Servi…

QT - 日志:qDebug/qInfo/qWarning/qCritical

篇一、日志打印函数 头文件&#xff1a; #include <QDebug> 代码&#xff1a;qDebug()<<"hello world!"; 其他打印级别&#xff1a; qInfo(): 普通信息 qDebug(): 调试信息 qWarning(): 警告信息 qCritical(): 严重错误 qFatal(): 致命错误 1. qDebug…

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

前言【Unity 实用工具篇】| Unity 实现背景模糊效果,简单易用一、实现背景模糊效果1.1 介绍1.2 效果展示1.3 使用说明及下载二、插件资源简单介绍2.1 导入下载好的资源2.2 功能介绍2.2.1 捕获特效2.2.2 高级选项

String Encryptor custom Bean not found with name ‘jasyptStringEncryptor‘...

项目采用 spring boot 2.6.13 jasypt-spring-boot-starter 3.0.5 apollo-client 1.6.0 自定义jasyptStringEncryptor&#xff0c;服务器上启动死活报找不到bean jasyptStringEncryptor&#xff0c;采用默认的&#xff0c;密文配置项自然解密失败导致服务无法启动。 经过一…

Layui三级联动插件使用方法

Layui高版本中没有在提供三级联动这个动画了&#xff0c;而是封装成了一个插件&#xff0c;使用方式也很简单 官网 省市县区三级联动下拉选择器 layarea - Layui 第三方扩展组件平台 (layuion.com)https://dev.layuion.com/extend/layarea/#doc html页面约束 整个选择器需要…

VSCode安装及Python、Jupyter插件安装使用

VSCode 介绍 Visual Studio Code&#xff08;简称VSCode&#xff09;是一个由微软开发的免费、开源的代码编辑器。VSCode是一个轻量级但是非常强大的代码编辑器&#xff0c;它支持多种编程语言&#xff08;如C,C#&#xff0c;Java&#xff0c;Python&#xff0c;PHP&#xff0…

UE4_材质节点

UE4_材质节点 2017-12-07 13:56 跑九宫格 跑UV 评论(0)