Redis学习 ——缓存

文章目录

  • 一、Redis缓存的介绍
  • 二、Redis缓存问题
    • 2.1 缓存穿透
    • 2.2 缓存击穿
    • 2.3 缓存雪崩
    • 2.4 双写一致性
    • 2.5 缓存持久化
      • RDB
      • AOF
  • 三、缓存数据管理
    • 3.1 数据过期策略
    • 3.2 数据淘汰策略

一、Redis缓存的介绍

我们在日常的代码编写中比较少使用到Redis,但是如果涉及到了比较大型的项目,常常避不开Redis这一项技术,那么在什么样的场景需要使用Redis呢。首先我们得明白Redis是一个高性能得键值数据库,我们使用它得原因很简单,就是因为快。这个问题在大并发,高负载的网站中必须考虑。redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此Redis的的的在性能上对比其他基于硬盘存储的数据库有非常明显的优势。并且除了性能方面的优势,Redis作为数据库的缓冲,可以很好的解决并发问题,避免了数据库因为过多的并发请求而崩溃。所以其实在项目较大,需要多次请求的场景下,我们都可以考虑使用Redis。本文是根据黑马教程学习中所编写的引用了黑马程序员视频中的课件图片。

二、Redis缓存问题

在Redis缓存正常运行的情况下,它的运行流程如:
在这里插入图片描述

2.1 缓存穿透

在缓存这正常流程中,我们可能会遇到缓存穿透问题,也就是我们去申请查询一个不存在的数据
那么由于我们无法在Redis中命中,我们就会直接到数据库去申请,那么每次查询不存在的数据都会直接向数据库发出请求,这就会对数据库造成很大的压力。
为了解决缓存穿透问题,常见的有几种方案:

  • 解决方案1:将空数据缓存,这种方式简单,但会消耗内存,并且有可能造成不一致的问题
  • 解决方案2:使用布隆过滤器。
    在这里插入图片描述
    那么布隆过滤器是如何实现帮助我们过滤的呢?
    布隆过滤器中有一个bitmap也就是以bit为单位的数组,每个单元的值只能为0或者1,然后我们需要明白布隆过滤器也是需要初始化的,也就是上图中缓存预热时,预热布隆过滤器。那么存储时,我们会对数据的主键进行多个hash函数计算,将计算出来的值对应的bitmap中的单元值改为1,查询数据判断主键经过多个hash函数计算后的单位位是否位1,如果是则数据库中含有该元素。
    但是需要明白的是由于有多个hash函数,一个主键如id1对应的可能是好几个bitmap单元位,必须全部为1的情况下才说明含有该元素。也有可能会出现误判的情况,如:
    在这里插入图片描述
    在这种情况下,bitmap数组越大,误判的概率就越低。

2.2 缓存击穿

缓存击穿问题其实是当某一个时刻key过期,并且在这个时刻发送过来了大量的并发请求,这些请求就有可能把DB击垮。
解决的方案有两种:互斥锁和逻辑过期
在这里插入图片描述
互斥锁解决方案具有强一致,性能差的特点
在这里插入图片描述
逻辑过期则是高可用,性能优,但是可能会出现线程1这样的返回旧数据的情况,可以根据是否需要保证数据的强一致性来选择解决方案。

2.3 缓存雪崩

缓存雪崩就是在一段时间内大量缓存key失效或者Redis宕机,导致大量请求抵达数据库造成压力。
在这里插入图片描述
给不同Key添加随机值不用说,Spring cloud gateway也就是网关,我们可以通过在后端的SSM配置中的网关来限流,nginx的限流配置也十分简单,这两个方案就不多讲了。其中限流策略实用性较高
重点需要讲的是Redis集群中的哨兵模式和集群模式:
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动恢复,监测方式如下:
在这里插入图片描述
在知道了基本的监测方式后,Redis集群还可能出现脑裂问题:
在这里插入图片描述
当网络恢复后,该master就会变成后半部分集群的slave,会清空数据后与后半集群的master数据同步,那么刚刚写入的数据就丢失了,为了解决这个问题,我们需要设置,当你想要写入数据,master必须含有一个slave节点,这样就可以避免脑裂问题。

2.4 双写一致性

这个问题需要考虑的是自己的业务背景是一致性要求高还是允许延迟一致
在这里插入图片描述
其中强一致性中的两个锁的方式如下:
在这里插入图片描述

2.5 缓存持久化

在Redis中提供了两种持久化方式:1、RDB 2、AOF

RDB

RDB也就是Redis Database Backup file(Redis数据备份文件),也就是Redis数据快照,把内存中的所有数据记录到磁盘之中,当Redis实例故障重启之后,从磁盘读取快照文件,恢复数据。在这里插入图片描述
RDB的实现原理也就是基于页表实现内存的的读取,如果不明白什么是页表,可以参考我之前发的文章操作系统基础。

AOF

AOF全称也就是Append Only File(追加文件),AOF文件可以看做是命令日志文件。,我们可以学习一下AOF如何开启和配置:
在这里插入图片描述
Redis中的AOF还具有重写功能,具体的使用配置可以参照下图:
在这里插入图片描述
两者区别:
在这里插入图片描述

三、缓存数据管理

3.1 数据过期策略

在这里插入图片描述
而这种策略可以分为

  • 惰性删除:设置key过期时间过后,不去管它,如果当需要该key时再检查,若过期就删除,反之返回key。这种方式的优点是对CPU比较友好,不会浪费资源检查。
    缺点:对内存不友好,如果没使用就永远不会释放
  • 定期删除:每隔一段时间定期检查删除过期的key
    在这里插入图片描述

3.2 数据淘汰策略

数据淘汰的情况发生再当内存不够用时,我们需要决定淘汰那些数据来存放新数据,其中有几种不同的删除策略如下图:
在这里插入图片描述
在了解了数据淘汰策略之后,我们肯定就需要了解使用这些策略的场景。
在这里插入图片描述

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

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

相关文章

“乐鑫组件注册表”简介

当启动一个新的开发项目时,开发者们通常会利用库和驱动程序等现有的代码资源。这种做法不仅节省时间,还简化了项目的维护工作。本文将深入探讨乐鑫组件注册表的概念及其核心理念,旨在指导您高效地使用和贡献组件。 概念解析 ESP-IDF 的架构…

视觉SLAM--经典视觉SLAM框架

整个视觉SLAM流程主要包括以下步骤: 1、传感器信息读取:在视觉SLAM中主要为相机图像信息的读取和预处理。 2、前端视觉里程计:估算相邻图像间相机的运动,以及局部地图的样子。 3、后端(非线性)优化&#…

Spring IOC注入方式、Bean作用域

Spring IOC注入 手动注入 set方法注入 需要提供set方法 public class UserService {private UserDao userDao; ​public void setUserDao(UserDao userDao) {this.userDao userDao;} } 设置属性字段的值 <bean id"userService" class"com.shsxt.servi…

Ajax的相关内容

一、Ajax的使用步骤 1.创建XML对象 const xhrnew XMLHttpRequest(); 2.监听事件&#xff0c;处理响应 3.准备发送请求 true表示异步 ajax中永远是异步&#xff0c;永远是true 4.发送请求 二、GET和POST请求 三、JSON的三种形式 四、JSON的方法 五、跨域 六、XHR的属性和方法…

有限状态机(续)

一、添加刀光和场景 1、资源链接&#xff1a; 武器刀光&#xff1a;https://assetstore.unity.com/packages/tools/particles-effects/melee-weapon-trail-1728 场景&#xff1a;https://assetstore.unity.com/packages/3d/environments/fantasy/casual-tiny-environment-ju…

【日常记录-Git】撤销工作区中所有已跟踪文件的修改

1. 简介 在Git中&#xff0c;若想恢复工作区中的所有文件到它们最后一次提交时的状态&#xff0c;可以使用 git restore 命令结合适当的选项来实现。不过&#xff0c;需要注意的是&#xff0c;git restore 默认不会递归地恢复目录&#xff0c;但你可以通过指定 . (代表当前目…

2024年11月16日 星期六 重新整理Go技术

今日格言 坚持每天进步一点点~ 一个人也可以是一个团队~ 学习全栈开发, 做自己喜欢的产品~~ 简介 大家好, 我是张大鹏, 今天是2024年11月16日星期六, 很高兴在这里给大家分享技术. 今天又是休息的一天, 做了很多的思考, 整理了自己掌握的技术, 比如Java, Python, Golang,…

微信小程序02-页面制作

微信小程序页面制作指南 目录 微信小程序页面制作 1. 个人信息展示小程序 案例分析 需求背景&#xff1a;许多大学生毕业后需要求职&#xff0c;因此制作一个展示个人信息的微信小程序对招聘人员快速了解求职者非常有帮助。页面布局&#xff1a;页面分为头像区域和详细信息…

【Linux】软件包管理器yum、编辑器vim

Linux 1.源码安装 和 软件包安装2.软件包管理器yum1.什么是包管理器 3.vim编辑器1.vim常见的三种模式2.vim命令模式&#xff1a;命令集3.vim底行模式&#xff1a;命令集4.使用vim的小技巧5.vim配置 1.源码安装 和 软件包安装 在Linux下安装软件&#xff0c;一个通常的办法是下…

高项 - 项目进度管理

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 博文更新参考时间点&#xff1a;2024-12 高项 - 章节与知识点汇总&#xff1a;点击跳转 文章目录 高项 - 项目进度管理进度管理ITO规划监控 管理基础项目进度计划的定义和总要求管理新实践用户故事&#xff08;补…

【CSS】opacity 影响 z-index 不生效

准备知识 一般来说&#xff0c;z-index 不生效的原因有&#xff1a; 父元素的 position 属性&#xff1a; z-index 只对 position 属性为 relative、absolute 或 fixed 的元素有效。 其他元素的 z-index&#xff1a; 如果页面中有其他元素也设置了较高的 z-index&#xff0c;…

11.15 ~ 18日志

1.Problem - A - Codeforces 这道题感觉网上的题解都讲得非常复杂,但是也给了我一些启发,最后a出来后发现并没有那么困难,首先这题假设我们的答案是x,那么就代表有(sum k) / x个牌堆,想要让x合法需要满足两个条件 1.(sum k) / x > maxn,因为每副牌堆不能有重复的牌,那么…

django安装与项目创建

一、安装 在终端输入 pip install django //或者(&#xff09;指定安装版本 pip install django2.2 二、创建项目 2.1创建项目 django-admin startproject 项目名 2.2Django 项目中的关键文件 _init_.py:将目录标识为python包setting.py:核心配置文件&#xff0c;定义项目…

《高压物理学报》

刊载内容主要包括&#xff1a; 高温高压下材料的力、热、光、电、磁等特性 高温高压下材料的微观结构和相变 高温高压物态方程 动态及静态高压加载和测试技术 高压合成新材料 高压地球和行星科学 高压下物质的动态响应 冲击和爆轰现象 高压与化学、生物等交叉科学及技…

Python学习28天

#冒泡排序&#xff0c;将如下列表从大到小排序 num[1,2,3,4,5] print(f"排序前&#xff1a;{num}")#第一次排序&#xff1a;将最小的排到最后一个位置&#xff1a; # 第1次比较 [2,1,3,4,5] # 第2次比较 [2,3,1,4,5] # 第3次比较 [2,3,4,1,5] # 第4次比较 [2,3,4,5,…

Shell脚本5 -- 脚本与用户交互read

声明&#xff1a; 本文的学习内容来源于B站up主“泷羽sec”视频【shell编程&#xff08;4&#xff09;脚本与用户交互以及if条件判断】的公开分享&#xff0c;所有内容仅限于网络安全技术的交流学习&#xff0c;不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题&#xff0c…

【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法

【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法 目录 文章目录 【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法目录摘要&#xff1a;研究背景&#xff1a;问题与挑战&#xff1a;如何解…

【网络安全 | 漏洞挖掘】未授权获取AI聊天内容

未经许可,不得转载。 文章目录 两天前,我收到了一项私人项目的邀请,内容看起来像是一个聊天机器人,类似于 Gemini 或 ChatGPT。于是我开始测试该项目的一些业务逻辑漏洞和 IDOR(不当访问控制)漏洞。尽管这个产品拥有一个强大的安全团队,网站上也部署了 WAF(Web 应用防火…

7天掌握SQL - 第一天:数据库基础与SQL入门

目标 在本章节中&#xff0c;我们将学习数据库的基本概念和SQL语言的基础操作&#xff0c;为后续的深入学习打下坚实的基础。 一级目录 数据库基本概念SQL语言基础SQL操作实践推荐资源总结 1. 数据库基本概念 1.1 表&#xff08;Table&#xff09; 表是数据库中存储数据的…

vue实现展示并下载后端返回的图片流

// 点击下载 downLoadCode() {const image new Image();image.setAttribute("crossOrigin", "anonymous");image.onload () > {const canvas document.createElement("canvas");canvas.width image.width;canvas.height image.height;c…