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 数据淘汰策略

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

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

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

相关文章

【阅读记录-章节2】Build a Large Language Model (From Scratch)

目录 2.Working with text data2.1 Understanding word embeddings2.2 Tokenizing text通过一个简单的实验来理解文本的词元化概念关键概念 2.3 Converting tokens into token IDs实现分词器类(Tokenizer Class)应用分词器测试文本的编码与解码通过分词器…

etcd部署(基于v3.5.15)

etcd部署 单节点部署下载etcd,解压etcd二进制包,并进入解压后目录创建数据目录移动可执行文件到/usr/local/bin/目录测试版本配置systemd管理启动etcd,设置开机启动验证 集群部署(3节点)环境准备准备3台服务器配置3台服务器hosts配置3台服务器…

HTML5实现趣味飞船捡金币小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 游戏中界面1.2 飞船边界框效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143799554 HTML5实现趣味飞船捡金币小游戏(附源码)&…

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择&#xff1a; Specific type IActionResult ActionResult<T> 1. 返回指定类型&#xff08;Specific type&#xff09; 最简单的API会返回原生的或者复杂的数据类型&#xff08;比如&#xff0c;string 或者…

汽车资讯新动力:Spring Boot技术驱动

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Go语言跨平台桌面应用开发新纪元:LCL、CEF与Webview全解析

开篇寄语 在Go语言的广阔生态中&#xff0c;桌面应用开发一直是一个备受关注的领域。今天&#xff0c;我将为大家介绍三款基于Go语言的跨平台桌面应用开发框架——LCL、CEF与Webview&#xff0c;它们分别拥有独特的魅力和广泛的应用场景。通过这三款框架&#xff0c;你将能够轻…

如何确保爬取的数据准确性和完整性?

在数据驱动的业务环境中&#xff0c;爬虫程序的准确性和完整性至关重要。本文将探讨如何使用Java编写爬虫程序&#xff0c;并确保其在爬取数据时的准确性和完整性。 1. 精确的HTML解析 确保数据准确性的第一步是精确地解析HTML。Jsoup是Java中常用的HTML解析库&#xff0c;它提…

【linux】如何扩展磁盘容量(VMware虚拟机)-转载

如何扩展磁盘容量(VMware虚拟机) 一、前置准备工作 扩展虚拟机磁盘前&#xff0c;需要先把虚拟机关机才能进行扩展磁盘操作 1.选择虚拟机设置&#xff0c;如下图所示 2.输入你想扩展的磁盘容量&#xff0c;以本次实操为例&#xff0c;我这里输入的30G&#xff08;具体按照实…

esp32学习:windows下idf离线安装(最简单)

很多朋友学习esp32时发现&#xff0c;安装idf很麻烦&#xff0c;需要很多依赖&#xff0c;那有没有简单的方法呢&#xff0c;答案是肯定的. 乐鑫Windows 平台工具链的标准设置 - ESP32-S3 - — ESP-IDF 编程指南 release-v5.0 文档编程指南里提供了windows下离线安装包 dl.espr…

tensorflow案例6--基于VGG16的猫狗识别(准确率99.8%+),以及tqdm、train_on_batch的简介

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 本次还是学习API和如何搭建神经网络为主&#xff0c;这一次用VGG16去对猫狗分类&#xff0c;效果还是很好的&#xff0c;达到了99.8% 文章目录 1、tqdm…

Amazon Web Services (AWS)

一、Amazon Web Services (AWS)介绍 1、简介 2、产品 AWS 提供了各种云计算服务&#xff0c;包括 DynamoDB、S3、EC2、Lambda 等等。 登录aws后点击所有服务也可以看到amazon的所有服务&#xff1a; 3、免费试用产品 除了免费的Amazon Step Functions、Amazon Lambda&#…

Quartus+Nios II for eclipse问题合集

由于对于FPGANIOS II 的工作需要&#xff0c;对工作过程中遇到的问题进行记录&#xff0c;持续更新。 1、BSP directory does not exist: . Stop.Nios II使用过程中遇到的一些问题2_error executing nios2-bsp-generate-files --bsp-di-CSDN博客https://blog.csdn.net/qq_39485…

Java项目:校园宿舍管理系统(优质版)(Springboot3+Maven+Mybatis Plus+Vue3+ Element Plus+Mysql)

项目介绍 : Springboot3MavenMybatis PlusVue3 Element PlusMysql 开发的前后端分离的校园宿舍管理系统 项目演示: https://www.bilibili.com/video/BV16UmoYWEVR/ 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#x…

RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)

文章目录 RabbitMQ教程&#xff1a;发布/订阅模式&#xff08;Publish/Subscribe&#xff09;&#xff08;三&#xff09;一、引言二、简介三、准备工作3.1 说明3.2 生成项目 四、实战4.1 交换机&#xff08;Exchanges&#xff09;4.2 临时队列&#xff08;Temporary Queues&am…

SpringBoot(6)-Shiro

目录 一、是什么 二、准备工作 2.1 环境搭建 2.2 自定义Realm配置类 2.3 自定义shiro配置类 三、实践 3.1 请求拦截 3.2 用户认证 3.3 用户授权 3.4 shiro和thymeleaf整合 一、是什么 是java的一个安全框架 核心三大对象&#xff1a; 1、Subject【用户】 2、Secur…

Misc_01转二维码(不是二进制)

例题ctfhub/隐写v2.0 打开是一张图片 文件分离得到zip&#xff0c;爆破密码得到7878 打开得到0和1&#xff0c; !!!不是二进制转图片&#xff0c;直接是二维码 缩小能看到 000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000…

使用 K-means 算法进行豆瓣读书数据的文本聚类分析

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

STM32完全学习——F407ZGT6点亮LED

一、寄存器描述 我们想要点亮LED&#xff0c;无非就是对于寄存器的一些设置&#xff0c;主要分为两步&#xff0c;首先是需要打开相应GPIO的时钟&#xff0c;这是因为STM32在上电后&#xff0c;每个外设的时钟默认都是关闭的&#xff0c;需要我们手动打开。其次就是对GPIO的一…

Dubbo RPC线程模型

消费端线程模型&#xff0c;提供者端线程模型 消费端线程模型 对 2.7.5 版本之前的 Dubbo 应用&#xff0c;尤其是一些消费端应用&#xff0c;当面临需要消费大量服务且并发数比较大的大流量场景时&#xff08;典型如网关类场景&#xff09;&#xff0c;经常会出现消费端线程…

Python酷库之旅-第三方库Pandas(225)

目录 一、用法精讲 1056、pandas.PeriodIndex.dayofweek属性 1056-1、语法 1056-2、参数 1056-3、功能 1056-4、返回值 1056-5、说明 1056-6、用法 1056-6-1、数据准备 1056-6-2、代码示例 1056-6-3、结果输出 1057、pandas.PeriodIndex.day_of_week属性 1057-1、…