Redis学习 ——缓存

news2024/11/19 17:23:42

文章目录

  • 一、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.coloradmin.cn/o/2243518.html

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

相关文章

【开源免费】基于Vue和SpringBoot的在线考试系统(附论文)

本文项目编号 T 624 ,文末自助获取源码 \color{red}{T624,文末自助获取源码} T624,文末自助获取源码 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合,利用java技术建设在线考试系统,实现…

git-.git目录解析

目录 .git目录下的文件信息 logs:记录各个分支日志记录 refs:记录本地分支、远程分支、tag标签最新commitID config: 配置信息,详细内容解析看下面介绍HEAD: 工作空间当前所在分支 inde文件: 它又常被称为“暂存区”或“缓存区”。这个文件…

sglang 部署Qwen2VL7B,大模型部署,速度测试,深度学习

sglang 项目github仓库: https://github.com/sgl-project/sglang 项目说明书: https://sgl-project.github.io/start/install.html 资讯: https://github.com/sgl-project/sgl-learning-materials?tabreadme-ov-file#the-first-sglang…

前端pdf预览方案

前端pdf预览方案 pdf预览一般不需要前端生成pdf文件,pdf文件一般是通过接口,获取pdf文件【responseType:‘blob’,】或二进制文件流【responseType: ‘arraybuffer’,】或者已有的pdf文件。 前端PDF预览通常是通过读取现有的PDF文件,并使用…

Kotlin return与return@forEachIndexed

Kotlin return与returnforEachIndexed fun main() {val data arrayOf(0, 1, 2, 3, 4)println("a")data.forEachIndexed { index, v ->if (v 2) {//类似while循环中的continue//跳过,继续下一个forEachIndexed迭代returnforEachIndexed}println("…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

DDRPHY数字IC后端设计实现系列专题之数字后端floorplanpowerplan设计

3.2.3 特殊单元的布局 布图阶段除了布置 I/O 单元和宏单元,在 28nm 制程工艺时,还需要处理两种特 殊的物理单元,Endcap 和 Tapcell。 DDRPHY数字IC后端设计实现系列专题之后端设计导入,IO Ring设计 (1)拐…

css uniapp背景图宽度固定高度自适应可以重复

page {height: 100%;background-image: url(https://onlinekc.a.hlidc.cn/uploads/20241115/350f94aaf493d05625a7ddbc86c7804e.png);background-repeat: repeat;background-size: contain;} 如果不要重复 把background-repeat: repeat;替换background-repeat: no-repeat;

CC工具箱使用指南:【CAD导出界址点Excel】

一、简介 群友定制工具。 面图层导出界址点Excel表之前已经做过好几个,这个工具则是将CAD导出Excel。 CAD数据如下: 工具将如上截图中的边界线导出界址点Excel,并记录下面内的文字。 二、工具参数介绍 点击【定制工具】组里的【CAD导出界…

输出比较简介

输出比较简介 主要是用来输出PWM波形,这个波形是驱动电机的(智能车和机器人等)必要条件 OC(Output Compare)输出比较,还有IC,全称是Input Capture,意为输入捕获,还有CC…

力扣(leetcode)题目总结——辅助栈篇

leetcode 经典题分类 链表数组字符串哈希表二分法双指针滑动窗口递归/回溯动态规划二叉树辅助栈 本系列专栏:点击进入 leetcode题目分类 关注走一波 前言:本系列文章初衷是为了按类别整理出力扣(leetcode)最经典题目&#xff0c…

unity老猿随笔

下面是我最近开始整理的一些unity的基础知识和疑难杂症,如果大家有什么可以分享出来的经验,可以评论区留言,验证后整理进来,全猿学习!如果有不对的地方,也欢迎指正,避免误人子弟! l…

『VUE』30. 生命周期的介绍(详细图文注释)

目录 生命周期生命周期的8阶段生命周期小例子总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 生命周期 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤,比如设置好数据侦听,编译模板&#xf…

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

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

华为HCCDA云技术认证--网络服务

大家好呀!我是reload。今天继续带大家学习华为HCCDA云技术认证,涵盖华为云最为核心的计算、存储、网络、数据库、安全、部署等服务。今天学习网络服务相关内容。 登录华为云官网:https://www.huaweicloud.com/ ,进入首页&#xff…

rocketmq5源码系列--(一)--搭建调试环境

说在前头:阿里的rocketmq的文档是真他妈的烂的1b,很多东西都不说,全靠自己看源码,摸索,草,真的要吐血了 rocketmq的版本5而不是版本4,版本5比版本4多了个proxy rocketmq5 三个组件:…

如何通过电脑监控软件远程监控一台电脑的所有屏幕画面记录

7-1 本教程介绍一个简单的工具,可以安装在电脑中,按设置的时间间隔,自动对屏幕截图保存,并且可以在有网络的其它电脑上远程提取截图文件。 该软件用于自动记录电脑的屏幕画面内容和变化,如果你有这方面的使用场景&am…

Redis 概 述 和 安 装

安 装 r e d i s: 1. 下 载 r e dis h t t p s : / / d o w n l o a d . r e d i s . i o / r e l e a s e s / 2. 将 redis 安装包拷贝到 /opt/ 目录 3. 解压 tar -zvxf redis-6.2.1.tar.gz 4. 安装gcc yum install gcc 5. 进入目录 cd redis-6.2.1 6. 编译 make …

Spring Boot汽车资讯:科技与汽车的新篇章

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了汽车资讯网站的开发全过程。通过分析汽车资讯网站管理的不足,创建了一个计算机管理汽车资讯网站的方案。文章介绍了汽车资讯网站的系统分析部分&…

CSS:高级寄巧

精灵图 为什么需要精灵图呢? 一个网页中往往会应用很多小背景图作为修饰,当网页中的图像过多时,服务器就会频繁地接收和发送 请求图片,造成服务器请求压力过大,这将大大降低页面的加载速度。 因此,为了有…